import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
class TaskOne implements Callable<String> {
// 模拟中间人,存放任务结果
private StringBuilder sb;
public TaskOne(StringBuilder sb) {
this.sb = sb;
}
@Override
public String call() throws Exception {
synchronized (sb) {
// 这个任务要等另一个任务完成,中间人没有获取到另一个任务的结果的时候
// 此任务要一直等待
while (sb.length() == 0) {
sb.wait();
}
}
sb.append("哈哈,task one终于等到task two运行完成了~~ task one结束");
return sb.toString();
}
}
class TaskTwo implements Callable<String> {
// 模拟中间人,任务结果放在这个里面
private StringBuilder sb;
public TaskTwo(StringBuilder sb) {
this.sb = sb;
}
@Override
public String call() throws Exception {
synchronized (sb) {
// 任务运行结果给中间人
sb.append("task two result");
sb.notify();
}
return sb.toString();
}
}
public class Test {
// 注意exec是单线程
static final ExecutorService exec = Executors.newSingleThreadExecutor();
public static void main(String[] args) throws Exception {
// 模拟中间人,存放任务结果
StringBuilder sb = new StringBuilder();
TaskOne taskOne = new TaskOne(sb);
TaskTwo taskTwo = new TaskTwo(sb);
long begin = System.currentTimeMillis();
// 先提交 taskOne, taskOne要等待taskTwo的运行结果
Future<String> one = exec.submit(taskOne);
// 再把taskTwo放入线程池运行
Future<String> two = exec.submit(taskTwo);
// 获取taskOne结果,但如果exec是个单线程的线程池
// taskOne等待taskTwo的结果,可taskTwo却要等到taskOne运行结束
// 才可以运行,造成了死锁,taskTwo永远不能获得cpu的运行,成饥饿状态
String s1 = one.get();
String s2 = two.get();
System.out.println(s2);
System.out.println(s1);
long end = System.currentTimeMillis();
System.out.println(end - begin);
// exec.shutdownNow();
}
}
分享到:
相关推荐
java多线程死锁预防机制研究,java多线程死锁预防机制研究
java线程实践,了解线程死锁,同步问题
基于java的开发源码-多线程程序死锁检查 JCarder.zip 基于java的开发源码-多线程程序死锁检查 JCarder.zip 基于java的开发源码-多线程程序死锁检查 JCarder.zip 基于java的开发源码-多线程程序死锁检查 JCarder.zip ...
Java多线程程序死锁检查 JCarder
明白死锁产生的原因,在程序中演示死锁产生并从而实现多线程陈旭解决死锁(deadlock)这一类问题。
通过观察、分析实验现象,深入理解线程及线程在调度执行和内存空间等方面的特点,并掌握线程与进程的区别。
java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁源码java死锁...
本书讨论了死锁、竞态条件以及饥饿等问题的细节,帮助你编写没有潜在bug的代码。 本书第二版提供了对Thread和ThreadGroup类、Runnable接口和语言的同步操作符内容的全面讨论。它解释了如何在不同的平台上调度线程,...
java多线程及死锁
java源码:Java多线程程序死锁检查 JCarder.zip
Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java线程:新特征-信号量 Java线程:新特征-...
本文首先介绍了线程的有关概念,接着介绍了线程的生命期及其状态间的转换,多线程的调度 原则,线程的死锁,详细阐述了多线程的两种实现方法: 由Thread类派生子类;实现Runnable接口
java 一个死锁的例子 java 一个死锁的例子 java 一个死锁的例子
Java多线程程序死锁检查 JCarder.7z
Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java线程:新特征-信号量 Java线程:新...
Java线程之死锁深入理解Java线程安全——银行欠我400万!!!线程执行的六大状态一、故事引入二、死锁死锁的产生三、线程通信等待通知四、代码案例线程释放锁标记主线程通知MyThread线程主线程通知哪个线程? 为了更...
一个详细讲解JAVA_线程同步与死锁的例子 希望可以帮助到你。
死锁在java 线程如何解决?这个实例描述了几个人资源共享的情况
Java线程:概念与原理 2 一、操作系统中线程和进程的概念 2 二、Java中的线程 3 三、Java中关于线程的名词解释 3 四、线程的状态转换和生命周期 4 ...Java线程:并发协作-死锁 55 Java线程:线程之间的数据传递 58
主要介绍了Java多线程死锁,结合实例形式分析了Java多线程出现死锁的相关原因与操作注意事项,需要的朋友可以参考下