[javaSE] 并发编程(线程间通信)

新建一个资源类Resource

定义成员变量String name

定义成员变量int age

新建一个输入类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();
    }

}
时间: 2024-10-13 01:02:01

[javaSE] 并发编程(线程间通信)的相关文章

java并发编程 线程间协作

线程间协作 1. 等待和通知 等待和通知的标准形式 等待方: 获取对象锁 循环中判断条件是否满足,不调用wait()方法 条件满足执行业务逻辑 通知方: 获取对象所 改变条件 通知所有等待在对象的线程 2. wait.notify/notifyAll wait:导致当前线程等待,直到有其他线程调用当前同步监视器的notify()或notifyall()方法来唤醒此线程.wait()方法有三种形式--无时间参数的wait(一直等待,直到其他线程通知),带毫秒参数的waut()和带毫秒和纳秒参数的w

VC++多线程编程-线程间的通信和线程同步

引用:http://blog.csdn.net/zjc0888/article/details/7372258 线程间通讯 一般而言,应用程序中的一个次要线程总是为主线程执行特定的任务,这样,主线程和次要线程间必定有一个信息传递的渠道,也就是主线程和次要线程间要进行通信.这种线程间的通信不但是难以避免的,而且在多线程编程中也是复杂和频繁的,下面将进行说明. 使用全局变量进行通信 由于属于同一个进程的各个线程共享操作系统分配该进程的资源,故解决线程间通信最简单的一种方法是使用全局变量.对于标准类型

Java并发——线程间通信与同步技术

传统的线程间通信与同步技术为Object上的wait().notify().notifyAll()等方法,Java在显示锁上增加了Condition对象,该对象也可以实现线程间通信与同步.本文会介绍有界缓存的概念与实现,在一步步实现有界缓存的过程中引入线程间通信与同步技术的必要性.首先先介绍一个有界缓存的抽象基类,所有具体实现都将继承自这个抽象基类: public abstract class BaseBoundedBuffer<V> { private final V[] buf; priv

Java线程间通信之wait/notify

Java中的wait/notify/notifyAll可用来实现线程间通信,是Object类的方法,这三个方法都是native方法,是平台相关的,常用来实现生产者/消费者模式.先来我们来看下相关定义: wait() :调用该方法的线程进入WATTING状态,只有等待另外线程的通知或中断才会返回,调用wait()方法后,会释放对象的锁. wait(long):超时等待最多long毫秒,如果没有通知就超时返回. notify() : 通知一个在对象上等待的线程,使其从wait()方法返回,而返回的前

进程间通信与线程间通信

序 今天被问及进程间通信的问题,发现自己了解的并不够,所以,对此好好总结一番~ 操作系统的主要任务是管理计算机的软件.硬件资源.现代操作系统的主要特点是多用户和多任务,也就是程序的并行执行,windows如此linux也是如此.所以操作系统就借助于进程来管理计算机的软.硬件资源,支持多任务的并行执行.要并行执行就需要多进程.多线程.因此多进程和多线程间为了完成一定的任务,就需要进行一定的通信.而线程间通信又和进程间的通信不同.由于进程的数据空间相对独立而线程是共享数据空间的,彼此通信机制也很不同

iOS开发NSOperation 三:操作依赖和监听以及线程间通信

一:操作依赖和监听 #import "ViewController.h" @interface ViewController () @end @implementation ViewController /** * 1:NSOperation的使用:1:先创建队列NSOperationQueue:若不创建队列直接封装任务则默认在当前线程中串行执行任务,其队列分为两种主队列和非主队列,主队列和GCD中的主队列一样[NSOperationQueue mainQueue],而alloc in

线程间通信和线程互斥

线程间通信 1> 线程间通信分为两种 主线程进入子线程(前面的方法都可以) 子线程回到主线程 2> 返回主线程 3> 代码 这个案例的思路是:当我触摸屏幕时,会在子线程加载图片,然后在主线程刷新UI界面 视图布局我就不写了,大家自己来吧,线程间通信代码如下: #pragma mark - 添加响应方法触发创建子线程并加载数据 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

【黑马】程序员————多线程(二)单例设计模式、线程间通信,JDK1.5互斥锁

------Java培训.Android培训.iOS培训..Net培训.期待与您交流!----- 一.单例设计模式 单例设计模式的意义: A.保证类在内存中只有一个对象,不提供外部访问方式,构造函数用private修饰. B.提供公共方法(static修饰,类的静态方法),获取类的实例.单例设计模式分为饿汉和懒汉两种模式. 饿汉式&懒汉式 class Test33 { public static void main(String[] args) { Fanjianan.getInstance()

线程间通信的三种方式(NSThread,GCD,NSOperation)

一.NSThread线程间通信 #import "ViewController.h" @interface ViewController ()<UIScrollViewDelegate> @property (strong, nonatomic) IBOutlet UIScrollView *scrollView; @property (weak, nonatomic)  UIImageView *imageView; @end @implementation ViewCo

进程间通信和线程间通信

进程间通信: # 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系.# 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信.# 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问.它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源.因此,主要作为进程间以及同一进程内不同线程之间的同步手段.#