标签:另一个 demo1 多线程 ace out 关系 直接 img 的区别
一、线程的基本状态
各种状态一目了然,值得一提的是"blocked"这个状态:
线程在Running的过程中可能会遇到阻塞(Blocked)情况
此外,在runnable状态的线程是处于被调度的线程,此时的调度顺序是不一定的。Thread类中的yield方法可以让一个running状态的线程转入runnable。
二、synchronized, wait, notify 是任何对象都具有的同步工具。
wait/notify必须存在于synchronized块中。并且,这三个关键字针对的是同一个监视器(某对象的监视器)。这意味着wait之后,其他线程可以进入同步块执行。当某代码并不持有监视器的使用权时(如图中5的状态,即脱离同步块)去wait或notify,会抛出java.lang.IllegalMonitorStateException。也包括在synchronized块中去调用另一个对象的wait/notify,因为不同对象的监视器不同,同样会抛出此异常。
synchronized单独使用:
public class Thread1 implements Runnable { Object lock; public void run() { synchronized(lock){ ..do something } } }
public class Thread1 implements Runnable { public synchronized void run() { ..do something } }
/** * 生产者生产出来的产品交给店员 */ public synchronized void produce() { if(this.product >= MAX_PRODUCT) { try { wait(); System.out.println("产品已满,请稍候再生产"); } catch(InterruptedException e) { e.printStackTrace(); } return; } this.product++; System.out.println("生产者生产第" + this.product + "个产品."); notifyAll(); //通知等待区的消费者可以取出产品了 } /** * 消费者从店员取产品 */ public synchronized void consume() { if(this.product <= MIN_PRODUCT) { try { wait(); System.out.println("缺货,稍候再取"); } catch (InterruptedException e) { e.printStackTrace(); } return; } System.out.println("消费者取走了第" + this.product + "个产品."); this.product--; notifyAll(); //通知等待去的生产者可以生产产品了 }
三、线程的两种创建方式
1.通过继承Thread类
package com.wc.study.thread.demo1; public class CreateThreadByExtends extends Thread{ @Override public void run() { System.out.println(Thread.currentThread().getName()); } public static void main(String[] args) { Thread thread1 = new CreateThreadByExtends(); Thread thread2 = new CreateThreadByExtends(); thread1.start(); thread2.start(); } }
2.通过实现Runnable接口
package com.wc.study.thread.demo1; public class CreateThreadByRunnable implements Runnable{ @Override public void run() { System.out.println(Thread.currentThread().getName()); } public static void main(String[] args) { Thread thread1 = new Thread(new CreateThreadByRunnable()); Thread thread2 = new Thread(new CreateThreadByRunnable()); thread1.start(); thread2.start(); } }
两者的区别:
标签:另一个 demo1 多线程 ace out 关系 直接 img 的区别
原文地址:https://www.cnblogs.com/xujf/p/13215229.html