Rumah > Java > javaTutorial > java中的Condition协作线程接口类

java中的Condition协作线程接口类

迷茫
Lepaskan: 2017-03-26 16:01:25
asal
2248 orang telah melayarinya

在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();// 解锁
		}
	}
}
Salin selepas log masuk

 

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

Atas ialah kandungan terperinci java中的Condition协作线程接口类. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan