• 技术文章 >Java >java教程

    java中的Condition协作线程接口类

    迷茫迷茫2017-03-26 16:01:25原创921

    在Java的Condition接口中,存在的几个方法跟Synchronized中的wait(),waitall(),wait(time ^),这个几个方法一一对应起来,但是在Lock.newCondition()返回中可以指定指定的线程释放和等待资源。

    请看【唤醒单个线程】实例:

    package TestThread.TestCondition;
    
    import java.util.concurrent.locks.ReentrantLock;
    import java.util.concurrent.locks.*;
    
    public class TestCondition {
    	public static void main(String[] args) {
    		ReentrantLock lock = new ReentrantLock();
    		Condition condition = lock.newCondition();
    		Test1 th1 = new Test1(lock, condition, "线程1");
    		Test1 th2 = new Test1(lock, condition, "线程2");
    		Test1 th3 = new Test1(lock, condition, "线程3");
    		Test2 t2 = new Test2(condition, lock, "我是唤醒线程");
    		th1.start();
    		th2.start();
    		th3.start();
    		try {
    			Thread.sleep(1000);
    			t2.start();
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    	}
    }
    
    class Test1 extends Thread {
    	private ReentrantLock lock;
    	private Condition condition1;
    
    	public Test1(ReentrantLock lock, Condition condition1, String name) {
    		super(name);
    		this.lock = lock;
    		this.condition1 = condition1;
    	}
    
    	@Override
    	public void run() {
    		for (int i = 0; i < 10; i++) {
    			try {
    				lock.lock();// 加锁
    				if (i == 5) {
    					try {
    						condition1.await();
    						System.out.println(Thread.currentThread().getName() + "当前线程获取到的值为:++++++++++++" + i);
    					} catch (InterruptedException e) {
    						System.out.println(Thread.currentThread().getName() + ":线程被中断了!");
    					}
    				} else {
    					System.out.println(Thread.currentThread().getName() + ":当前线程获取到的值为===》" + i);
    				}
    			} catch (Exception e) {
    				System.out.println("系统发生异常!");
    			} finally {
    				lock.unlock();// 解锁
    			}
    		}
    	}
    }
    
    class Test2 extends Thread {
    	private Condition condition;
    	public ReentrantLock lock;
    
    	/**
    	 * @param condition协作对象
    	 * @param lock锁对象
    	 * @param name线程名称
    	 */
    	public Test2(Condition condition, ReentrantLock lock, String name) {
    		super(name);
    		this.condition = condition;
    		this.lock = lock;
    	}
    
    	@Override
    	public void run() {
    		try {
    			lock.lock();// 加锁
    			condition.signal();// 唤醒启动单个线程
    			System.out.println(Thread.currentThread().getName() + ":已经唤醒了一个线程!");
    		} catch (Exception e) {
    			System.out.println(Thread.currentThread().getName() + ":线程挂了!");
    		} finally {
    			lock.unlock();// 解锁
    		}
    	}
    }

    运行结果:2017-03-2501:16:17

    以上就是java中的Condition协作线程接口类的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:关于JAVA 类总结 下一篇:Java多线程基础详解
    PHP编程就业班

    相关文章推荐

    • 详细介绍23种Java常见设计模式• 实例详解Java反序列化之反射机制• 五种方法!Java创建多线程总结• Java基础之类和对象、单例模式、继承• JAVA-5NIO之Selector

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网