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方法
废弃

这里写图片描述

0 0
原创粉丝点击