注: InterruptedException 线程等待时需要抛出异常,暂时接触到的有 wait(),join(),sleep();
喜讯: google旗下Android联合许多家手机公司在手机底层编程开始使用java,对于java程序员的意义大家自己可以自己考虑。
练习外语听力方法:尽量找自己能听得听力材料,听到直到耳熟能详(这对语感及词汇记忆都是一个很大的帮助),然后去选择其他的
趋势: 互联网 至 物联网的转变
线程之我见 总结: 多线程 (Thread)(理解,一个进程当中的多个任务)
多进程(多任务)针对 os(cpu来回切换,每个任务都有独立的内存空间)
区别:进程是独立的内存空间,线程是共享的数据空间,而这个数据空间正好是一个进程(一个内存空间)。
Thread类由JDK提供,用于封装对JVM中线程的控制。
线程的组成:1)cpu分给线程的时间片2)线程代码写在run()方法中3)线程数据
1.创建一个线程
JVM会创建默认的线程(main),用来运行主方法。
2.程序员可以创建自己定义的线程
定义线程的运行体
public class MyThread extends Thread {
public void run() {
for (int i = 0; i < 100000; i++) {
System.out.println("Thread" + i);
}
}
} Thread.sleep();
作用在于:让当前线程“挂起”sleep(若干毫秒)
让运行该方法的线程挂起。
3线程运行的俩种方式:
1)
public class TestThread{
public static void main(String[] args){
Thread th=new MyThread();
th.start();
}
}
class MyThread extends Thread{
public void run(){
需要执行的代码;
}
}
2)
public class TestThread implements Runnable{
public static void main(String[] args){
Thread th=new MyThread(new TestThread());
th.start();
}
public void run(){
需要执行的代码;
}
}
4线程的几种状态:1.运行(run) 2.就绪(ready)3阻塞挂起(block)其中阻塞又可分(A)控制台System.in +readLine() (B) wait(),join(),sleep()等
5守护线程
通过setDaemon方法,可以设置线程的守护线程。JVM如何发现当前的线程全部是守护线程时,就退出。
守护 非守护的区别:守护,主线程结束则不等子线程结束之前就结束程序。 非守护,主线程结束之前必须等所有的子线程执行完毕。
6 线程安全问题
什么情况些会出现线程安全问题:俩个以上的线程访问同一个可变对象。//同时访问一个String(不可变化) 则不会有安全问题
如何去避免:加锁。
synchronized(对象(monitor)){语句块}让对象把语句块看住,只允许一个线程在运行。(monitor相当于该语句块的通行证,它是唯一的)
public class NameList{
private List<String> nameList=new ArrayList<String>();
public void addName(String name){
System.out.println(..);
synchronized(obj){ nameList.add(name);}
}
} 如果当有这样的题目:这个类是否为线程安全??
相当于问:如果有俩个以上的线程的同时访问同一个对象 ,是否会线程安全问题。
public void f(){
synchronized(this){}
}
相当于
public synchronized void f(){}
当然这的this只适用于非静态方法。
7 了解线程安全及线程不安全的类
线程安全 :String ,Integer,Double 等八个基本类 StringBuffer
线程不安全(后来要求速度快,它诞生) :StringBuilder 除了(Vector,Hashtable早期的很少用了) 集合类都是线程不安全。
8了解一些Thread的基本方法:
setName(name);//设置线程名字
getName();//获得线程名字
getId();//获得线程ID
少用 setPriority(newPriority);设置线程优先级别(一般最高改到5 系统默认主方法为5)
getPriority();//获得线程级别
MAX_PRIORITY; //最高级别到10
MIN_PRIORITY;//最低级别到1
currentThread()//获得当前线程
8.timer and timerTask
例:
public class TestTimer {
public static void main(String[] args) throws InterruptedException {
// 调度器
Timer timer = new Timer();// 用于调度
timer.schedule(new MyTask(), 2000,100);
}
}
class MyTask extends TimerTask {
public void run() {
System.out.println("MyTask...");
}
}
timer 调度器 控制一个任务
TimerTask 用来定义一个任务
顺序延迟
Timer timer = new Timer();// 用于调度
timer.schedule(new MyTask(), 2000,100);//主方法在2秒后以0.1秒每次速度执行new MyTask()里的run方法体。
把内部用到的线程设置为守护线程
Timer timer1 = new Timer(true);
timer1.scheduleAtFixedRate(new MyTask(), 2000, 100);
schedule 和scheduleAtFixedRate区别:
前者 如果由于任何原因(如垃圾回收或其他后台活动)而延迟了某次执行,则后续执行也将被延迟
后者 如果由于任何原因(如垃圾回收或其他后台活动)而延迟了某次执行,则将快速连续地出现两次或更多的执行,从而使后续执行能够“追赶上来”。
9线程同步:
我的理解是在线程安全基础上为了保证上一个线程状态,而加上wait()和notify()的组合而造成的不安全因素。谨慎使用。
可以衍生到 (商业中的生产者消费者之间的平衡问题,生产者和消费者的市场调查)
wait():
1)任何对象都有的方法 注:想调用该对象的wait(),就必须有该对象的monitor(唯一的通行证)
2)该方法作用在于把monitor还回去
3)用该方法的对象(线程)一只在这里等待
notify():
1)唤醒一个wait()
notifyAll():
2)一次唤醒所有wait(),这当中就有一个随机的问题(线程安全synchronized要求一次)。。
喝水倒水的例子。
10 单列模式:
public class Foo {
public static Foo instance;
private Foo(){}
public synchronized static Foo getIntance(){
if(instance==null){
instance=new Foo();
}return instance;
}
}
synchronized 保证了该类是真正的单例
服务器端:多线程安全 单例(缓存)
单列模式用的场合:当一个服务器有相当大的访问量
单列模式:构造私有化 当然在类体内部可以new出他的构造来 原理,静态成员,静态方法不管你new多少次,它只有一个,外部访问的时候只能通过他的方法去访问该类。
public class Foo {
public static Foo instance;
private Foo(){}
public static Foo getIntance(){
if(instance==null){
instance=new Foo();
}return instance;
}
}11.ThreadLocal
12.Collection 接口,Collections(Array)类
1。单例模式
2。Wrapper 包装模式
Collections.synchronizedList(list) 把一个(list)线程不安全的list对象放进去,出来的是一个线程安全的
Collections.unmodifiableList(list) 返回一个不能修改的list
1)同一个接口
2)加以包装
13目前join,yield
14结束线程的几种方式:
中间涉及到反模式。
喜讯: google旗下Android联合许多家手机公司在手机底层编程开始使用java,对于java程序员的意义大家自己可以自己考虑。
练习外语听力方法:尽量找自己能听得听力材料,听到直到耳熟能详(这对语感及词汇记忆都是一个很大的帮助),然后去选择其他的
趋势: 互联网 至 物联网的转变
线程之我见 总结: 多线程 (Thread)(理解,一个进程当中的多个任务)
多进程(多任务)针对 os(cpu来回切换,每个任务都有独立的内存空间)
区别:进程是独立的内存空间,线程是共享的数据空间,而这个数据空间正好是一个进程(一个内存空间)。
Thread类由JDK提供,用于封装对JVM中线程的控制。
线程的组成:1)cpu分给线程的时间片2)线程代码写在run()方法中3)线程数据
1.创建一个线程
JVM会创建默认的线程(main),用来运行主方法。
2.程序员可以创建自己定义的线程
定义线程的运行体
public class MyThread extends Thread {
public void run() {
for (int i = 0; i < 100000; i++) {
System.out.println("Thread" + i);
}
}
} Thread.sleep();
作用在于:让当前线程“挂起”sleep(若干毫秒)
让运行该方法的线程挂起。
3线程运行的俩种方式:
1)
public class TestThread{
public static void main(String[] args){
Thread th=new MyThread();
th.start();
}
}
class MyThread extends Thread{
public void run(){
需要执行的代码;
}
}
2)
public class TestThread implements Runnable{
public static void main(String[] args){
Thread th=new MyThread(new TestThread());
th.start();
}
public void run(){
需要执行的代码;
}
}
4线程的几种状态:1.运行(run) 2.就绪(ready)3阻塞挂起(block)其中阻塞又可分(A)控制台System.in +readLine() (B) wait(),join(),sleep()等
5守护线程
通过setDaemon方法,可以设置线程的守护线程。JVM如何发现当前的线程全部是守护线程时,就退出。
守护 非守护的区别:守护,主线程结束则不等子线程结束之前就结束程序。 非守护,主线程结束之前必须等所有的子线程执行完毕。
6 线程安全问题
什么情况些会出现线程安全问题:俩个以上的线程访问同一个可变对象。//同时访问一个String(不可变化) 则不会有安全问题
如何去避免:加锁。
synchronized(对象(monitor)){语句块}让对象把语句块看住,只允许一个线程在运行。(monitor相当于该语句块的通行证,它是唯一的)
public class NameList{
private List<String> nameList=new ArrayList<String>();
public void addName(String name){
System.out.println(..);
synchronized(obj){ nameList.add(name);}
}
} 如果当有这样的题目:这个类是否为线程安全??
相当于问:如果有俩个以上的线程的同时访问同一个对象 ,是否会线程安全问题。
public void f(){
synchronized(this){}
}
相当于
public synchronized void f(){}
当然这的this只适用于非静态方法。
7 了解线程安全及线程不安全的类
线程安全 :String ,Integer,Double 等八个基本类 StringBuffer
线程不安全(后来要求速度快,它诞生) :StringBuilder 除了(Vector,Hashtable早期的很少用了) 集合类都是线程不安全。
8了解一些Thread的基本方法:
setName(name);//设置线程名字
getName();//获得线程名字
getId();//获得线程ID
少用 setPriority(newPriority);设置线程优先级别(一般最高改到5 系统默认主方法为5)
getPriority();//获得线程级别
MAX_PRIORITY; //最高级别到10
MIN_PRIORITY;//最低级别到1
currentThread()//获得当前线程
8.timer and timerTask
例:
public class TestTimer {
public static void main(String[] args) throws InterruptedException {
// 调度器
Timer timer = new Timer();// 用于调度
timer.schedule(new MyTask(), 2000,100);
}
}
class MyTask extends TimerTask {
public void run() {
System.out.println("MyTask...");
}
}
timer 调度器 控制一个任务
TimerTask 用来定义一个任务
顺序延迟
Timer timer = new Timer();// 用于调度
timer.schedule(new MyTask(), 2000,100);//主方法在2秒后以0.1秒每次速度执行new MyTask()里的run方法体。
把内部用到的线程设置为守护线程
Timer timer1 = new Timer(true);
timer1.scheduleAtFixedRate(new MyTask(), 2000, 100);
schedule 和scheduleAtFixedRate区别:
前者 如果由于任何原因(如垃圾回收或其他后台活动)而延迟了某次执行,则后续执行也将被延迟
后者 如果由于任何原因(如垃圾回收或其他后台活动)而延迟了某次执行,则将快速连续地出现两次或更多的执行,从而使后续执行能够“追赶上来”。
9线程同步:
我的理解是在线程安全基础上为了保证上一个线程状态,而加上wait()和notify()的组合而造成的不安全因素。谨慎使用。
可以衍生到 (商业中的生产者消费者之间的平衡问题,生产者和消费者的市场调查)
wait():
1)任何对象都有的方法 注:想调用该对象的wait(),就必须有该对象的monitor(唯一的通行证)
2)该方法作用在于把monitor还回去
3)用该方法的对象(线程)一只在这里等待
notify():
1)唤醒一个wait()
notifyAll():
2)一次唤醒所有wait(),这当中就有一个随机的问题(线程安全synchronized要求一次)。。
喝水倒水的例子。
10 单列模式:
public class Foo {
public static Foo instance;
private Foo(){}
public synchronized static Foo getIntance(){
if(instance==null){
instance=new Foo();
}return instance;
}
}
synchronized 保证了该类是真正的单例
服务器端:多线程安全 单例(缓存)
单列模式用的场合:当一个服务器有相当大的访问量
单列模式:构造私有化 当然在类体内部可以new出他的构造来 原理,静态成员,静态方法不管你new多少次,它只有一个,外部访问的时候只能通过他的方法去访问该类。
public class Foo {
public static Foo instance;
private Foo(){}
public static Foo getIntance(){
if(instance==null){
instance=new Foo();
}return instance;
}
}11.ThreadLocal
12.Collection 接口,Collections(Array)类
1。单例模式
2。Wrapper 包装模式
Collections.synchronizedList(list) 把一个(list)线程不安全的list对象放进去,出来的是一个线程安全的
Collections.unmodifiableList(list) 返回一个不能修改的list
1)同一个接口
2)加以包装
13目前join,yield
14结束线程的几种方式:
中间涉及到反模式。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货