线程通讯和线程安全实例

package com.xiaoju.demo;

/**
 * Hello world!
 * Thread Communication and Thread safe Sample!!
 *
 */
public class App
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
        // Thread Communication
        Q q = new Q();
        new Thread(new Producer(q)).start();
        new Thread(new Consumer(q)).start();

    }
}

class Producer implements Runnable{
    Q q;
    public Producer(Q q){
        this.q=q;
    }
    public void run(){
        int i=0;
        while (true){
            if(i==0){
                q.put("zhangsan","male");
            }
            else {
                q.put("lisi","female");
            }
            i=(i+1)%2;
        }
    }
}

class Consumer implements Runnable{
    Q q;
    public Consumer(Q q)
    {
        this.q=q;
    }
    public void run(){
        while (true){
            q.get();
        }
    }
}

class Q{
    private String name="unknown";
    private String sex="unknown";
    private boolean bFull=false;
    public synchronized void put(String name,String sex){
        if(bFull) {
            try {
                wait();
            } catch (Exception e) {
            }
        }

        this.name=name;
        try{Thread.sleep(1);}catch (Exception e) {}
        this.sex=sex;
        bFull=true;
        notify();
    }

    public synchronized void get(){
        if(!bFull)
        {
            try{wait();} catch (Exception e) {}
        }

        System.out.print(name);
        System.out.println(":"+sex);
        bFull=false;
        notify();
    }

}
				
时间: 2024-12-23 18:33:21

线程通讯和线程安全实例的相关文章

线程通讯

/* 线程通讯: 一个线程完成了自己的任务时,要通知另外一个线程去完成另外一个任务. 生产者与消费者 wait(): 等待 如果线程执行了wait方法,那么该线程会进入等待的状态,等待状态下的线程必须要被其他线程调用notify方法才能唤醒. notify(): 唤醒 唤醒线程池等待线程其中的一个. notifyAll() : 唤醒线程池所有等待 线程. wait与notify方法要注意的事项: 1. wait方法与notify方法是属于Object对象 的. 2. wait方法与notify方

Java线程中的join使用实例

JDK中解释为 Waits for this thread to die. 等待本线程结束后,下一个线程才可以运行. 实例要求: 现在有T1.T2.T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行 实现代码: package com.st.lesson02; public class Test01 { //1.现在有T1.T2.T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行 public static void main(String[] args)

基于NIO的消息路由的实现(四) 服务端通讯主线程(1)

一.简单介绍: 服务端通讯主线程是消息路由服务的启动类,其主要作用如下: 1.初始化相关配置: 2.根据配置的ip和port创建tcp服务: 3.接收客户端连接,并给客户端分配令牌: 4.接收客户端的登录请求,并将客户端相关信息(令牌.客户端登录标识.最后访问时间.当前token所使用的通道,保存到缓冲区) 5.接收客户端的报文请求,并添加到通讯队列,等待处理: 6.接收来自各处的指令发送请求,并发送至相关通道: 二.详细介绍: 1.启动方法:首先加载配置信息:然后启动主线程.通讯报文消费线程(

通过线程通讯获取手机正在运行中的软件及大小(仿手机管家 扫描软件)

其实我原本是只想说一个线程之间的通讯 handler,但是觉得内容有点少,就直接写了个demo.我之前是做过仿手机管家这种软件的(当然只是自己做着好玩的),所以 就提取了一点内容结合线程通讯写了个小的demo. 不说废话了,直接上代码: activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas

C# 线程--第四线程实例

概述 在前面几节中和大家分享了线程的一些基础使用方法,本章结合之前的分享来编写一些日常开发中应用实例,和编写多线程时一些注意点.如大家有好的实例也欢迎分享.. 应用实例 应用:定时任务程序 场景:系统中常常会有一些需要定时去循环执行的存储过程或方法等,这时就出现了定时任务小程序. 模型:查询需定时执行的计划任务-->插入线程池-->执行任务 static void MainMethod() { Thread thead; thead = new Thread(QueryTask); thead

Java线程池详解及实例

前言 多线程的异步执行方式,虽然能够最大限度发挥多核计算机的计算能力,但是如果不加控制,反而会对系统造成负担.线程本身也要占用内存空间,大量的线程会占用内存资源并且可能会导致Out of Memory.即便没有这样的情况,大量的线程回收也会给GC带来很大的压力. 为了避免重复的创建线程,线程池的出现可以让线程进行复用.通俗点讲,当有工作来,就会向线程池拿一个线程,当工作完成后,并不是直接关闭线程,而是将这个线程归还给线程池供其他任务使用. 接下来从总体到细致的方式,来共同探讨线程池. 总体的架构

Python+PyQT5的子线程更新UI界面的实例《新手必学》

今天小编就为大家分享一篇Python+PyQT5的子线程更新UI界面的实例,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧子线程里是不能更新UI界面的,在移动端方面.Android的UI访问是没有加锁的,多个线程可以同时访问更新操作同一个UI控件.也就是说访问UI的时候,android系统当中的控件都不是线程安全的,这将导致在多线程模式下,当多个线程共同访问更新操作同一个UI控件时容易发生不可控的错误.所以Android中规定只能在UI线程中访问UI,相当于从另一个角度给Andr

线程基础:线程池(7)——基本使用(下)

(接上文<线程基础:线程池(6)--基本使用(中)>,我要加快进度,以便在2月份恢复"系统间通信技术"专栏的写作) 5.扩展ThreadPoolExecutor线程池 实际上JAVA中提供的ThreadPoolExecutor线程池是鼓励各位程序员进行扩展的(虽然大多数情况下您无需扩展),并且JBOSS(Netty).Apache(Camel)也正是这样在做.下面我们看看一些由ThreadPoolExecutor提供的扩展方式. 5-1.Hook methods 在Thre

线程与守护线程

线程 1,生产者消费者模型 什么是生产者与消费者模型 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题,生产者和消费者之间不直接通讯,而通过阻塞队列来通讯,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力 在并发编程中使用生产者和消费者模式能够解决大多数并发问题,该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度 基于队列(容器)实现生产者和消费者模型 2,线程 定义 进程是一个资源单位,线程是CPU上的执行单位 一个进程里面开多个线程,共享一个进程