标签:需要 start ble nts getname 经典的 demo 线程 lse
多个线程行为一致共同操作一个数据,最经典的例子就是卖票
public class ShareData { private int num =10; public synchronized void inc(){ num++; System.out.println(Thread.currentThread().getName()+"调用inc这个方法num = "+num); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }
package com.example.threadTest; /** * Description: hibernate * Created by lenovo on 2019/6/1 19:33 */ public class Ticket implements Runnable{ private ShareData shareData; public Ticket(ShareData shareData) { this.shareData = shareData; } public Ticket() { } @Override public void run() { for (int i=0;i<5;i++){ shareData.inc(); } } public static void main (String[] args){ ShareData shareData = new ShareData(); for (int i=0;i<4;i++){ new Thread(new Ticket(shareData),"Thread"+i).start(); } } }
2.多个线程行为不一致,共同操作一个数据
如果每个线程执行的代码不同这个时候就需要调用不同的Runnable对象,有两种方法实现这个Runnable对象之间的数据共享
,将共享数据封装在另外一个对象中,然后将这些对象逐一传递给各个Runnable对象 ,每一个线程对共享数据的操作方法也分配到那个对象身上去完成,这样就容易实现针对
该数据进行的各个操作的互斥和通信。
哎,先看实现再看这个总结就会恍然大悟。
在共享数据的对象里面添加不同的实现方法
package com.example.demo1; /** * Description: hibernate * Created by lenovo on 2019/6/1 19:57 */ public class MyThread implements Runnable{ private SharaData sharaData; public MyThread() { } public MyThread(SharaData sharaData) { this.sharaData = sharaData; } public static void main (String[] args){ SharaData sharaData = new SharaData(); for (int i=0;i<4;i++){ if (i%2==0){ new Thread(new MyThread(sharaData),"Thread"+i).start(); }else{ new Thread(new MyThreadDec(sharaData),"Thread"+i).start(); } } } //封装共享数据类 @Override public void run() { for (int i=0;i<5;i++){ sharaData.inc(); } } }
//
package com.example.demo1; /** * Description: hibernate * Created by lenovo on 2019/6/1 20:07 */ public class MyThreadDec implements Runnable{ //封装共享数据 private SharaData sharaData; public MyThreadDec(SharaData sharaData) { this.sharaData = sharaData; } @Override public void run() { for (int i=0;i<5;i++){ sharaData.dec(); } } }
//共享数据类
package com.example.demo1; /** * Description: hibernate * Created by lenovo on 2019/6/1 19:57 */ public class SharaData { private int num =10; public synchronized void inc(){ num++; System.out.println(Thread.currentThread().getName()+"调用inc这个方法num = "+num); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } public synchronized void dec(){ num++; System.out.println(Thread.currentThread().getName()+"调用inc这个方法num = "+num); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }
第二种方法
将这些Runnable对象作为一个类中的内部类,共享数据作为这个外部类中的成员变量,你每一个线程对共享数据的操作方法也分配给外部类,、
以便实现对共享数据进行的各个操作的互斥和通信,作为内部类的各个Runnable对象调用外部类的这些方法
package com.example.demo1; /** * Description: hibernate * Created by lenovo on 2019/6/1 20:33 */ public class Thread2 { public static void main (String[] args){ final SharaData sharaData = new SharaData(); for (int i=0;i<4;i++){ if (i%2==0){ new Thread(new Runnable() { @Override public void run() { for (int i=0;i<5;i++){ sharaData.inc(); } } },"Thread"+i).start(); }else{ new Thread(new Runnable() { @Override public void run() { for (int i=0;i<5;i++){ sharaData.dec(); } } },"Thread"+i).start(); } } } }
标签:需要 start ble nts getname 经典的 demo 线程 lse
原文地址:https://www.cnblogs.com/zhulina-917/p/10960888.html