第一章Java多线程技能

今天开始看java多线程编程核心技术,增加一些对多线程的理解。记录下一些书中重要的部分及自己的一些理解。

    书开始介绍的几个多线程例子没什么好说,就是怎么去创建线程。

1>currentThread()这个方法是返回代码段被哪个线程调用的信息。

    Thread.currentThread()放在主线程,指的就是主线程,放在子线程,指的就是子线程。

2>isAlive()判断当前线程是否处于活动状态。

    创建线程未执行时时false,执行中是true。

3>sleep()让当前正在执行的线程休眠,单位是毫秒。

4>getId()获取线程的唯一标识。

5>第一个知识点:停止线程。

        停止线程有三种方法:

            1、使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。

            2、使用stop强行终止线程。这个方法已经是作废过期的方法,因为它会导致线程安全问题。

            3、使用interrupt方法中断线程。


其中第一种方式不做说明,第二种是强行终止线程。书中的例子很好,基本不存在看不懂。主要是第三种方法,下面是代码

public class Demo1 {
    public static void main(String[] args){
        try {
            MyThread thread=new MyThread();
            thread.start();
//            Thread.interrupted();
//            thread.interrupt();
            Thread.sleep(500);
            thread.interrupt();
            System.out.println("是否停止1?="+thread.isInterrupted());
            System.out.println("是否停止2?="+thread.interrupted());
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

class MyThread extends Thread{
    @Override
    public void run() {
        for(int i=0;i<500000;i++){
            if(this.interrupted()){
                break;
            }
            System.out.println("i="+(i+1));
        }
        System.out.println("end");
    }
}
interrupt()就是给线程打上中断标志,interrupted()是查看当前线程是否是中断状态而且会清除interrupt打上的标志,isInterrupted()也是查看当前线程是否是中断状态,但是不会清除interrupt标志。他们三者单独使用都无法中断线程,必须是interrupt+interrupted或者interrupt+isInterrupted组合起来使用。
最后说一下,这个中断并不是立即停止,它会执行完当前方法。如果不想线程继续执行,可以在if中抛出一个异常或者return,具体看业务场景。在sleep状态下去中断这个线程,会进入catch语句,并清除停止状态。

6>(1)suspend()暂停线程

    (2)resume()恢复线程执行

暂停线程是不会释放锁的,容易造成数据不同步的问题。

7>yield()出让线程执行权。

    虽然让出了cpu,但是随时可能又“抢”回来。

8>setPriority(int)设置线程优先级

    优先级是1~10级,1的优先级最低,10最大,默认是5。优先级具有“随机性”,并不一定是优先级高的就先执行完。

9>setDaemon(boolean)守护线程

    最典型的守护线程:GC(垃圾回收器),线程分为用户线程和守护线程,用户线程执行完毕之后,守护线程会自动销毁。主线程执行完毕,子线程不一定执行结束。只有子线程为守护线程,才会自动结束。



猜你喜欢

转载自blog.csdn.net/csdnchen666666/article/details/80488412
今日推荐