线程
软件中并发的执行过程(方法)。
并发
操作系统采用分时调度策略将多个程序交替运行,宏观上,就是几个程序同步后执行。
java中的多线程编程
Thread
Thread 线索,线程。
Thread 封装了操作系统对线程的地调度过程。
使用Thread类创建线程
- 继承Thread类,继承了复杂的线程管理功能。
- 重写run方法,就是并发执行的方法,线程执行时候,将执行修改以后的run方法。
- 用start方法,启动线程:将线程交付给操作系统,由操作系统负责调度管理。
直接执行run方法,就不是线程执行了
线程代码
class MyThread extends Thread{
public void run(){
System.out.println("HelloWorld");
}
}
MyThread t = new MyThread();
t.start();
线程实现
- 继承Thread
- 重写run方法
- 创建线程对象
使用Runnable 接口
- 实现Runnable接口,实现run方法。
- 创建接口的子类实例。
- 创建线程对象,讲接口的子类实例作为线程参数。
- 调用用start方法,启动线程。
- 使用实现Runnable接口,可以更好的避免由于Java单继承特性,
导致的扩展性难,同时实现了线程的共享性
案例:
class MyRunner implements Runable{
public void run(){
System.out.println("Hello World");
}
}
//启动线程
MyRunner runner = new MyRunner();
Thread t = new Thread(runner);
t.start();
>使用Runnable接口创建线程的好处是,当前的可以继承于其他的类,
>也可以继承其他的接口。
线程的状态
- new 是新建状态,使用new运算创建线程对象,是线程的初始状态。
- Runnable 可运行状态,也称就绪状态,线程已经交接给操作系统,由操作系统负责调用,等待合适的时机准备运行。
- Running 正在运行状态,操作系统分配时间片给线程,线程调度到CPU执行。
- Delete 线程结束状态,线程结束了run方法,线程将会被垃圾回收器回收,死亡线程将不会再被调用。
- Java启动的时候,会自动创建并启动主线程。
- main方法被主线程调用。
线程优先级表
- 默认优先级5
- 最高优先级 10
- 最低优先级 1
- 优先级高的线程,获取CPU时间片多,执行机会多
- 但是在计算机资源丰富的情况下,运行结果不明显
守护线程
- 守护线程与普通线程并没有什么区别,我们只需要通过Thread提
供的方法来设定即可- void setDaemon(boolean)
- 当参数为true时该线程为守护线程
- 守护线程的特点是:当进程中只剩下为守护线程时,所有守护线程强制终止
- GC就是运行在一个守护线程上的
当全部前台线程结束的时候,如果后台线程还没有结束
这时候,守护线程结束,不会执行后面的操作
CyclicBarrier和CountDownLatch
都可以用来让一组线程等待另一组线程。但是CyclicBarrier可以重复
使用,CountDownLatch不可重复使用,就是直到等待线程全部结束后
使用
管程锁定规则,程序次序规则,volatile变量规则,
- 程序次序规则:线程内代码能够按先后顺序执行。
- 管程锁定规则:对于同一个锁,一个解锁操作一定要发生在(时间上)
另一个锁操作之前。 - volatile变量规则:前一个对volatile的写操作在后一个volatile
的读操作之前。- volatile是一个特殊的修饰符,,只有成员变量才能使用它。
在Java并发程序缺少同步类的情况下,多线程对成员变量操作对
其他线程时透明的。 - volatile变量可以保证下一个读取操作会在前一个写操作之后
发生。
- volatile是一个特殊的修饰符,,只有成员变量才能使用它。
- 线程启动规则:一个线程的所有操作均在线程启动之后。
- 终止规则:所有的线程操作均在线程终止之前完成。
- 对象终结规则:一个对象的终结操作必须发生在对象构造完成之后。
- 可传递性
Sleep
- 用于使程序进行适当休眠。
- 唤醒机制,用于两个线程之间进行协调工作。
线程进入sleep block 时候,线程不占用处理器,操作系统可以讲处
理器分配给其他的线程,线程只有在running的时候才占用处理器
6/5/2017 9:08:49 PM
yeild()方法
线程停下来等待另一个线程(主动放弃当前对处理器的调用)
jion()方法
两个或者多个线程协调,一个线程必须结束另一个线程才能开启
public class ThreadDemo2{
public static void main(String[] args){
T1 t1 = new T1();
T2 t2 = new T2();
List<Integer> list = new ArrayList<Integer>();
t1.list = list;
t2.list = list;
t1.t2 = t2;
t2.t1 = t1;
t1.start();
t2.start();
}
}
class T1 extends Thread{
List<Integer> list;
public void run(){
for(int i = 0;i<10;i++){
list.add((int)(Math.random()*100));
}
System.out.println("T1:"+list);
}
}
class T2 extends Thread{
List<Integer> list;
T1 t1;
public void run(){
try{
t1.join();
//t1线程正常结束
Collections.sort(t1);
System.out.println("T2" + list);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}