java笔记--关于线程通信

关于线程通信

使用多线程编程的一个重要原因就是线程间通信的代价比较小

--如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3897773.html "谢谢--

关键技术:

yield(): Thread类的一个静态方法,用来暂停当前正在执行的线程对象,并执行其他线程

public static void yield(){}

代码实例:

实现线程间的发送和接收消息

package com.xhj.thread;

/**
 * 线程之间的通信 Thread.yeild()暂停当前线程,执行其他线程
 *
 * @author XIEHEJUN
 *
 */
public class CommunicationThread {

    /**
     * 发送线程类
     *
     * @author XIEHEJUN
     *
     */
    private class SendThread implements Runnable {
        private String[] products = { "java宝典", "C#宝典", "C宝典", "C++宝典",
                "Pyhtion宝典" };
        private volatile String productName;
        private volatile boolean sendState;

        public String getProductName() {
            return productName;
        }

        public void setSendState(boolean sendState) {
            this.sendState = sendState;
        }

        public boolean isSendState() {
            return sendState;
        }

        @Override
        public void run() {
            for (int i = 0; i < 5; i++) {
                while (sendState) {
                    Thread.yield();
                }
                productName = products[i];
                System.out.println("发送:" + productName);
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                sendState = true;
            }
        }
    }

    /**
     * 接受线程类
     *
     * @author XIEHEJUN
     *
     */
    private class ReceiveThrend implements Runnable {
        private SendThread send;

        public ReceiveThrend(SendThread send) {
            this.send = send;
        }

        @Override
        public void run() {
            for (int i = 0; i < 5; i++) {
                while (!send.isSendState()) {
                    Thread.yield();
                }
                System.out.println("接收:" + send.getProductName());
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                send.setSendState(false);
            }

        }

    }

    /**
     * 调用线程
     */
    public void useThread() {
        SendThread send = new SendThread();
        ReceiveThrend receive = new ReceiveThrend(send);
        System.out.println("线程1");
        Thread thread1 = new Thread(send);
        thread1.start();
        System.out.println("线程2");
        Thread thread2 = new Thread(receive);
        thread2.start();
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        CommunicationThread communicationThread = new CommunicationThread();
        communicationThread.useThread();

    }
}

注:线程间的通信重点关注通信的内容,要确保其是同步的,而且各个线程对该资源使用后是要及时释放的,

否则将会出现死锁现象。而且在实际应用当中,商品的信息通常都是存储在数据库中的。

java笔记--关于线程通信

时间: 2024-11-03 03:04:48

java笔记--关于线程通信的相关文章

java笔记--使用线程池优化多线程编程

使用线程池优化多线程编程 认识线程池 在Java中,所有的对象都是需要通过new操作符来创建的,如果创建大量短生命周期的对象,将会使得整个程序的性能非常的低下.这种时候就需要用到了池的技术,比如数据库连接池,线程池等. 在java1.5之后,java自带了线程池,在util包下新增了concurrent包,这个包主要作用就是介绍java线程和线程池如何使用的. 在包java.util.concurrent下的 Executors类中定义了Executor.ExecutorService.Sche

java笔记--关于线程死锁

关于线程死锁 什么是死锁: 在编写多线程的时候,必须要注意资源的使用问题,如果两个或多个线程分别拥有不同的资源, 而同时又需要对方释放资源才能继续运行时,就会发生死锁. 简单来说:死锁就是当一个或多个进程都在等待系统资源,而资源本身又被占用时,所产生的一种状态. 造成死锁的原因: 多个线程竞争共享资源,由于资源被占用,资源不足或进程推进顺序不当等原因造成线程处于永久阻塞状态,从而引发死锁 --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/389

java笔记--守护线程的应用

守护线程的应用 Java中的线程可以分为两类,即用户线程和守护线程.用户线程是为了完成任务,而守护线程是为其他线程服务 --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3894292.html "谢谢-- 守护线程的唯一用途是为其他线程提供服务.守护线程会随时中断,因此不要在守护线程上使用需要释放资源的资源,如输入输出流,数据库连接等所有的守护线程都是后台线程,如果虚拟机中只剩下守护线程,虚拟机就会退出 Thread类与守护线程相关

Java多线程编程核心技术读书笔记(3)-线程通信

线程是操作系统中独立的个体,但是这些个体如果无法经过特殊的处理就不能成为一个整体.线程间通信可以实现线程间的信息互换.相互唤起等功能,是系统的交互性更加强大,大大提高CPU的利用率,同时还能让开发者对各个线程任务有清晰的把控和监督,最常用的线程通信方法就是--等待/通知机制. 一.等待/通知机制 1.wait() / notify() 等待/通知机制在生活中比比皆是,例如:厨师/服务员的菜品传递台.生产者/消费者模式,JDK中通过Object里面的两个方法 wait() / notify() 来

Java笔记七.线程间通信与线程生命的控制

线程间通信与线程生命的控制 一.线程通信方法 Java是通过Object类的wait.notify.notifyAll这几个方法来实现进程键的通信.由于所有的类都是从Object继承的,因此在任何类中都可以直接使用这些方法. wait:告诉当前线程放弃监视器并进入睡眠状态,知道其他线程进入同一监视器并调用notify为止; notify:唤醒同一对象监视器中调用wait的第一个线程.用于类似饭馆有一个空位后通知所有等候就餐的顾客中的第一位可以入座的情况: notifyAll:唤醒同一对象监视器中

java中的线程通信

原文链接 作者:Jakob Jenkov 译者:杜建雄  校对:方腾飞 java中线程通信的目标是使线程间能够互相发送信号.另一方面,线程通信使线程能够等待其他线程的信号. 例如,线程B可以等待线程A的一个信号,这个信号会通知线程B数据已经准备好了. 1.通过共享对象通信 java学习中线程间发送信号的一个简单方式是在共享对象的变量里设置信号值.线程A在一个同步块里设置boolean型成员变量hasDataToProcess为true,线程B也在同步块里读取hasDataToProcess这个成

Java多线程之线程通信

线程通信的例子:使用两个线程打印 1-100,线程1.线程2交替打印.涉及到的三个方法:wait():一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器.notify():一旦执行此方法,就会唤醒被wait的一个线程.如果有多个线程被wait,就唤醒优先级高的那个.notifyAll():一旦执行此方法,就会唤醒所有被wait的线程. 说明:1.wait(),notify(),notifyAll()三个方法必须使用在同步代码块或同步方法中.2.wait(),notify(),notifyA

Java中实现线程通信的三个方法的作用是什么?

Java提供了3个方法解决线程之间的通信问题,均是java.lang.Object类的方法,都只能在同步方法或者同步代码块中使用,否则会抛出异常. 方法名 作 用 final void wait() 表示线程一直等待,直到其它线程通知 void wait(long timeout) 线程等待指定毫秒参数的时间 final void wait(long timeout,int nanos) 线程等待指定毫秒.微妙的时间 final void notify() 唤醒一个处于等待状态的线程.注意的是在

java笔记之线程方式1启动线程

* 需求:我们要实现多线程的程序. * 如何实现呢? *   由于线程是依赖进程而存在的,所以我们应该先创建一个进程出来. *   而进程是由系统创建的,所以我们应该去调用系统功能创建一个进程. *   Java是不能直接调用系统功能的,所以,我们没有办法直接实现多线程程序. *   但是呢?Java可以去调用C/C++写好的程序来实现多线程程序. *   由C/C++去调用系统功能创建进程,然后由Java去调用这样的东西, *   然后提供一些类供我们使用.我们就可以实现多线程程序了. * 那