线程状态、同步

 

 

关于线程5种状态,创建、就绪、运行、阻塞、死亡;学习时候主要理解逻辑结构,这样5种状态就能够很容易的掌握理解,上面结构希望对你们理解有所帮助。

其次最难掌握的就是线程同步时的状态 ,当某个线程thread1获得synchronized同步锁,其他线程进入阻塞状态,直到thread1线程释放同步锁时候,其他线程通过notify()唤醒线程重新获得同步锁,等待cpu调度,就绪状态,获得CPU后在进入运行状态。

对于线程同步:存在共享同一数据源的时候,存在线程安全。
主要通过二种:同步方法和同步代码块
public synchronized void run(){
sale();//多线程时,同步方法运行时候有可能需要等待长时间,效率低
}

public void run(){
while(true){
synchronized(this){//同步代码块,效率相比较高
sale();
}
}
}

关于初学者,能够知道理解这些知识我感觉已经够了。如有不足,希望多多指正,谢谢

 六种说法:

 

public class TheatDemo {
    public static void main(String[] args) throws InterruptedException {
        // 线程状态 NEW
        Thread t1 = new Thread(() -> {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }, "线程1:");
        System.out.println(t1.getName() + t1.getState());

        // 线程状态 RUNNABLE
        Thread t2 = new Thread(() -> {
            while (true) {
            }
        }, "线程2:");
        t2.start();
        Thread.sleep(1000);
        System.out.println(t2.getName() + t2.getState());

        // 线程状态 BLOCKED
        Object obj = new Object();
        Thread t3 = new Thread(() -> {
            synchronized (obj) {
            }
        }, "线程3:");
        synchronized (obj) {
            t3.start();
            Thread.sleep(500);
            System.out.println(t3.getName() + t3.getState());
        }

        // 线程状态 WAITING
        Thread t4 = new Thread(() -> {
            synchronized (obj) {
                try {
                    obj.wait();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }, "线程4:");
        t4.start();
        Thread.sleep(500);
        System.out.println(t4.getName() + t4.getState());

        // 线程状态 WAITING
        Thread t5 = new Thread(() -> {
            synchronized (obj) {
                try {
                    obj.wait(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }, "线程5:");
        t5.start();
        Thread.sleep(500);
        System.out.println(t5.getName() + t5.getState());

        // 线程状态 TERMINATED
        Thread t6 = new Thread(() -> {
        }, "线程6:");
        t6.start();
        Thread.sleep(500);
        System.out.println(t6.getName() + t6.getState());
    }
}

 

posted @ 2018-01-29 13:40  chch213  阅读(236)  评论(0编辑  收藏  举报