标签:dem padding 生产 创建线程 str 重写 roo stack color
首发日期:2018-05-13
class MyThread extends Thread{ public void run() { for (int i=0;i<10;i++) { System.out.println("子线程拿到执行权"); } } } public class Demo { public static void main(String[] args) { MyThread t=new MyThread(); t.start(); for (int i=0;i<10;i++) System.out.println("主线程运行"); } }
上述代码结果【该结果有随机性,如果想要有明显的抢夺运行权,可以增大i】:
主线程运行
子线程拿到执行权
子线程拿到执行权
子线程拿到执行权
子线程拿到执行权
子线程拿到执行权
主线程运行
主线程运行
主线程运行
主线程运行
虽然已经有了继承Thread实现的多线程,但是由于在java中只支持单继承,一个类一旦继承了某个父类就无法再继承Thread类 ,因为这样,所以才有了Runable实现的多线程,这样的多线程是将实现接口Runable的类的对象传入Thread()中来创建线程对象。
实现方法:
class Car implements Runnable{ public void run() { for (int i=0;i<5;i++) { System.out.println("子线程拿到执行权"); } } } public class Demo { public static void main(String[] args) { Car c=new Car(); Thread t=new Thread(c); t.start(); for (int i=0;i<5;i++) System.out.println("主线程运行"); } }
上述代码结果【该结果有随机性,如果想要有明显的抢夺运行权,可以增大i】:
主线程运行
子线程拿到执行权
子线程拿到执行权
子线程拿到执行权
子线程拿到执行权
子线程拿到执行权
主线程运行
主线程运行
主线程运行
主线程运行
默认情况下,主线程会等待其他线程结束才会结束程序运行,设置守护线程的效果是:如果一个线程设置成了守护线程,那么主线程不会等待该线程结束就结束程序运行(如果非主线程就只有这一个的话)
yield():让出自己的CPU权限,重新进入队列中竞争CPU权限【这时候优先级高的占便宜】
为什么需要线程同步:
当使用上锁后,可能会发生死锁。A拿了锁1,A想要拿锁2;B拿了锁2,B想要拿锁1;于是就发生了死锁。
解决方法:只能避免。避免相互调用彼此的锁(或者说某种独占资源)
线程通信最经典的例子是生产者-消费者例子:生产者生产完后提醒一下消费者来消费,消费者消费完后提醒生产者生产。【一个盘子时,生产者生产完就得叫消费者;多个盘子时,生产者判断是否没有空盘子再自己进行等待,消费者判断没有东西消费就等待】
class RestRoom{ int count=0; boolean panzi=true; public synchronized void produce() { try { if(!panzi) { this.wait(); } count++; System.out.println("我生产了一个面包"+count); panzi=false; this.notify(); }catch(InterruptedException e) { e.printStackTrace(); } } public synchronized void consume() { try { if(panzi) {//有空盘子 this.wait(); } System.out.println("我消费了一个面包"+count); panzi=true; this.notify(); }catch(InterruptedException e) { e.printStackTrace(); } } } class Producer implements Runnable{ RestRoom r; Producer(RestRoom r){ this.r=r; } public void run() { for(int i=0;i<100;i++) { r.produce();//生产100次 } } } class Consumer implements Runnable{ RestRoom r; Consumer(RestRoom r){ this.r=r; } public void run() { for(int i=0;i<100;i++) { r.consume();//生产100次 } } } public class TongbuDemo { public static void main(String[] args) { RestRoom r=new RestRoom(); Producer pro=new Producer(r); Consumer con=new Consumer(r); Thread t1=new Thread(pro); Thread t2=new Thread(con); t1.start(); t2.start(); } }
使用注意:
package runable_线程; class RestRoom{ int count=0; boolean panzi=true; public synchronized void produce() { try { while(!panzi) { this.wait(); } count++; System.out.println("我生产了一个面包"+count); panzi=false; this.notifyAll(); }catch(InterruptedException e) { e.printStackTrace(); } } public synchronized void consume() { try { while(panzi) {//有空盘子 this.wait(); } System.out.println("我消费了一个面包"+count); panzi=true; this.notifyAll(); }catch(InterruptedException e) { e.printStackTrace(); } } } class Producer implements Runnable{ RestRoom r; Producer(RestRoom r){ this.r=r; } public void run() { for(int i=0;i<100;i++) { r.produce();//生产100次 } } } class Consumer implements Runnable{ RestRoom r; Consumer(RestRoom r){ this.r=r; } public void run() { for(int i=0;i<100;i++) { r.consume();//生产100次 } } } public class TongbuDemo { public static void main(String[] args) { RestRoom r=new RestRoom(); Producer pro=new Producer(r); Producer pro2=new Producer(r); Consumer con=new Consumer(r); Consumer con2=new Consumer(r); Thread t1=new Thread(pro); Thread t2=new Thread(pro2); Thread t3=new Thread(con); Thread t4=new Thread(con2); t1.start(); t2.start(); t3.start(); t4.start(); } }
在单一的生产者和消费者时,代码与上面相同大略。
当多个多个生产者或多个消费者时,那么就需要定义不同的Condition对象了,不同的condition对象,唤醒的线程也不一样,比如可以定义一个condition对象专门代表消费者,那么使用这个对象.signal()时就会唤醒消费者。
package runable_线程; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; class RestRoom{ int count=0; boolean panzi=true; ReentrantLock lock=new ReentrantLock(); Condition condition_pro = lock.newCondition(); Condition condition_con = lock.newCondition(); public void produce() { lock.lock(); try { if(!panzi) { condition_pro.await(); } count++; System.out.println("我生产了一个面包"+count); panzi=false; // this.notifyAll(); condition_con.signal();//唤醒消费者 }catch(InterruptedException e) { e.printStackTrace(); }finally { lock.unlock(); } } public void consume() { lock.lock(); try { if(panzi) {//有空盘子 condition_con.await(); } System.out.println("我消费了一个面包"+count); panzi=true; // this.notifyAll(); condition_pro.signal();//唤醒生产者 }catch(InterruptedException e) { e.printStackTrace(); }finally { lock.unlock(); } } } class Producer implements Runnable{ RestRoom r; Producer(RestRoom r){ this.r=r; } public void run() { for(int i=0;i<100;i++) { r.produce();//生产100次 } } } class Consumer implements Runnable{ RestRoom r; Consumer(RestRoom r){ this.r=r; } public void run() { for(int i=0;i<100;i++) { r.consume();//生产100次 } } } public class TongbuDemo { public static void main(String[] args) { RestRoom r=new RestRoom(); Producer pro=new Producer(r); Producer pro2=new Producer(r); Consumer con=new Consumer(r); Consumer con2=new Consumer(r); Thread t1=new Thread(pro); Thread t2=new Thread(pro2); Thread t3=new Thread(con); Thread t4=new Thread(con2); t1.start(); t2.start(); t3.start(); t4.start(); } }
标签:dem padding 生产 创建线程 str 重写 roo stack color
原文地址:https://www.cnblogs.com/progor/p/9033147.html