10 Java并发编程2-Thread类总结
来源:互联网 发布:豆沙色唇膏 知乎 编辑:程序博客网 时间:2024/05/16 16:02
http://www.cnblogs.com/dolphin0520/p/3920357.html
1 线程的状态
创建(new)、就绪(runnable)、运行(running)、阻塞(blocked)、time waiting、waiting、消亡(dead)。
有些教程上将blocked、waiting、time waiting统称为阻塞状态,也是可以的。
2 线程上下文切换
对于单核CPU来说(对于多核CPU,此处就理解为一个核),CPU在一个时刻只能运行一个线程,当在运行一个线程的过程中转去运行另外一个线程,这个叫做线程上下文切换(对于进程也是类似)。
3 Thread类中的方法
Thread类的属性:
* name: Thread的名字
* priority:线程的优先级(最大值为10,最小值为1,默认值为5)
* daemon:是否是守护线程
* target : 要执行的任务
关于属性的方法:
* getId :用来得到线程ID
* getName和setName : 用来得到或者设置线程名称
* setDaemon和isDaemon:用来设置线程是否称为守护线程和判断线程是否是守护线程。守护线程依赖于创建它的线程,用户线程则不依赖。如果在main线程中创建一个守护线程,当main方法允许完毕之后,守护线程也会随着消亡。在JVM中,垃圾回收器线程就是一个守护线程。
Thread类静态方法
* currentThread() : 获取当前线程。
Thread类常用的方法:
1)start()
启动一个线程
2)run()
线程获得了CPU执行时间,便进入run方法去执行具体的任务。
3)sleep(long millis)/sleep(long millis,int nanoseconds)
让线程睡眠,交出CPU,让CPU去执行其他的任务。但是不会释放锁,也就是说如果当前线程持有对某个对象的锁,即使调用sleep方法,其他线程也无法访问这个对象。
package javazongjie;public class ThreadTest { private int i = 10; private Object object = new Object(); public static void main(String[] args) { ThreadTest test = new ThreadTest(); MyThread thread1 = test.new MyThread(); MyThread thread2 = test.new MyThread(); thread1.start(); thread2.start(); /** * i:11 线程Thread-0进入睡眠状态 线程Thread-0线程结束 i:12 i:13 线程Thread-1进入睡眠状态 线程Thread-1线程结束 i:14 */ } class MyThread extends Thread{ public void run() { synchronized (object) { i++; System.out.println("i:" + i); try{ System.out.println("线程" + Thread.currentThread().getName() + "进入睡眠状态"); Thread.currentThread().sleep(10000); }catch (InterruptedException e) { // TODO: handle exception } System.out.println("线程" + Thread.currentThread().getName() + "线程结束"); i++; System.out.println("i:" + i); } } }}
4) yield方法
让当前线程交出CPU权限,同样不会释放锁。但是不能控制具体的交出CPU的时间,另外,yield方法只能让拥有相同优先级的线程获取CPU执行时间的机会。yield方法,并不会让线程进入阻塞状态,二是重回就绪状态。
5)join()/join(long millis)/join(long millis,int nanoseconds)
假如在main线程中,调用thread.join方法,则main方法会等待thread线程执行完毕或者等待一定的时间。
package javazongjie;public class ThreadTest { public static void main(String[] args) { System.out.println("进入线程" + Thread.currentThread().getName()); ThreadTest test = new ThreadTest(); MyThread thread1 = test.new MyThread(); thread1.start(); try{ System.out.println("线程" + Thread.currentThread().getName() + "等待"); thread1.join(); System.out.println("线程" + Thread.currentThread().getName() + "继续执行"); }catch (Exception e) { // TODO: handle exception e.printStackTrace(); } /** * 进入线程main 线程main等待 进入线程Thread-0 线程Thread-0执行完毕 线程main继续执行 */ } class MyThread extends Thread{ public void run() { System.out.println("进入线程" + Thread.currentThread().getName()); try{ Thread.currentThread().sleep(10000); }catch (InterruptedException e) { // TODO: handle exception } System.out.println("线程" + Thread.currentThread().getName() + "执行完毕"); } }}
6)interrupt方法
中断的意思,中断一个正处于阻塞状态的线程。另外,通过interrupt方法和isInterrupted()方法来停止正在运行的线程。
interrupt方法可以中断处于阻塞状态的线程:
package javazongjie;public class ThreadTest { public static void main(String[] args) { ThreadTest test = new ThreadTest(); MyThread thread = test.new MyThread(); thread.start(); try{ Thread.currentThread().sleep(2000); }catch (InterruptedException e) { // TODO: handle exception } thread.interrupt(); /** * 进入睡眠状态 得到中断异常 run方法执行完毕 */ } class MyThread extends Thread{ public void run() { try{ System.out.println("进入睡眠状态"); Thread.currentThread().sleep(10000); System.out.println("睡眠完毕"); }catch (InterruptedException e) { System.out.println("得到中断异常"); } System.out.println("run方法执行完毕"); } }}
配合isInterrupted()能够中断正在运行的线程:
package javazongjie;public class ThreadTest { public static void main(String[] args) { ThreadTest test = new ThreadTest(); MyThread thread = test.new MyThread(); thread.start(); try{ Thread.currentThread().sleep(1); }catch (InterruptedException e) { } thread.interrupt(); /** * 0while循环 1while循环 2while循环 3while循环 4while循环 5while循环 //输出5个循环就结束了 */ } class MyThread extends Thread{ public void run() { int i = 0; while(!isInterrupted() && i<Integer.MAX_VALUE) { System.out.println(i + "while循环"); i++; } } }}
7 )stop方法
废弃的方法,不安全的。因为调用stop方法会直接终止run方法的调用,并且会抛出一个ThreadDeath错误,如果线程持有某个对象锁的话,会完成释放锁,导致对象状态不一致。
8 )destroy方法
废弃
- 10 Java并发编程2-Thread类总结
- Java并发编程--Thread
- java并发编程(2)--Thread类的使用
- Java并发编程:Thread类的使用
- Java并发编程:Thread类的使用
- Java并发编程:Thread类的使用
- Java并发编程:Thread类的使用
- Java并发编程:Thread类的使用
- Java并发编程:Thread类的使用
- Java并发编程:Thread类的使用
- Java并发编程:Thread类的使用
- Java并发编程:Thread类的使用
- Java并发编程:Thread类的使用
- Java并发编程:Thread类的使用
- Java并发编程:Thread类的使用
- Java并发编程:Thread类的使用
- Java并发编程:Thread类的使用
- Java并发编程:Thread类的使用
- 【JSP】JSP的九个内置对象
- Random Forest Classification of Mushrooms
- Codeforces 757E 积性函数
- Java之Timer使用
- Twitter的分布式自增ID算法snowflake - C#版
- 10 Java并发编程2-Thread类总结
- android四种基本布局之FrameLayoutAndTableLayout
- 性能测试的测试用例
- uva 193 Graph Coloring
- hdu3567 Eight II 康拓展开+打表+路径回溯+映射
- php时间戳的转换
- ubuntu16.04+qt 一些问题
- shell脚本实现删除过期数据库中的数据
- 400. Nth Digit