zl程序教程

您现在的位置是:首页 >  大数据

当前栏目

[javaSE] 并发编程(线程间通信)详解编程语言

2023-06-13 09:20:37 时间

新建一个输入类Input,实现Runnable接口

定义一个构造方法Input(),传入参数:Resource对象

实现run()方法

定义while(true)往Resuorce对象的属性赋值

 

 

新建一个输出类Output,实现Runnable接口

定义一个构造方法Output(),传入参数:Resource对象

实现run()方法

定义while(true)打印Resuorce对象的属性

 

 

main方法中

获取Resource对象,new出来

获取Input对象,new出来,构造参数:Resource对象

获取Output对象,new出来,构造参数:Resource对象

获取Thread对象,new出来,构造参数:Runnable对象

调用Thread对象的start()方法,开启线程

 

此时会有线程安全问题,查看结果可以发现,汉字和拼音的混了

陶士涵=====男

taoshihan=====nan

陶士涵=====nan

陶士涵=====nan

陶士涵=====男

陶士涵=====男

陶士涵=====nan

陶士涵=====nan

taoshihan=====nan

taoshihan=====nan

 

使用synchronized(){}同步代码块包裹操作同一个资源的地方

注意同步线程的个数,所有的线程都应该加上

注意是否是同一个锁,synchronized()括号内的锁参数:保证是个唯一的资源

使用synchronized(){}包裹上面的赋值和打印,锁:Resource对象(唯一的)

 

查看结果,此时没有安全问题

陶士涵=====男

陶士涵=====男

陶士涵=====男

taoshihan=====nan

taoshihan=====nan

taoshihan=====nan

 

死锁问题:同步中嵌套同步,并且锁不一致,此时会造成死锁问题

/** 

 * 资源 

 * @author taoshihan 

class Resource { 

 String name; 

 String sex; 

 * 输入 

 * @author taoshihan 

class Input implements Runnable { 

 private Resource resource; 

 public Input(Resource resource) { 

 this.resource = resource; 

 @Override 

 public void run() { 

 // 切换 

 boolean flag = true; 

 while (true) { 

 synchronized (resource) { 

 if (flag) { 

 resource.name = "taoshihan"; 

 resource.sex = "nan"; 

 } else { 

 resource.name = "陶士涵"; 

 resource.sex = "男"; 

 flag = !flag; 

 * 输出 

 * @author taoshihan 

class Output implements Runnable { 

 private Resource resource; 

 public Output(Resource resource) { 

 this.resource = resource; 

 @Override 

 public void run() { 

 while (true) { 

 synchronized (resource) { 

 System.out.println(resource.name + "=====" + resource.sex); 

public class InputOutputDemo { 

 /** 

 * @param args 

 public static void main(String[] args) { 

 Resource resource = new Resource(); 

 Input input = new Input(resource); 

 Output output = new Output(resource); 

 Thread t1 = new Thread(input); 

 Thread t2 = new Thread(output); 

 t1.start(); 

 t2.start(); 

}

 

12678.html

cjava