`
z610
  • 浏览: 39262 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

请教:java多线程问题

阅读更多
   java中有没有类似windows c++编程中的WaitForMultiObjects()的机制,同时等待多个条件,而不是一次等待一个
   比如,java中lock和conditon问题,假如有一个lock,有此lock生成了多个condition,c1,c2,...cn,假如存在两个线程,其中一个线程按如下等待条件,如
    c1.wait();
   c2.wait();
   ...
   cn.wait();

   而另一个线程如下等待条件
    cn.wait();
   ...
   c2.wait();
   c1.wait();
   这样就容易造成死锁,随着condition的增多和线程数量的增多,越是容易造成死锁,有没有个办法,要么可以同时获得c1,c2,...,cn,要么都不获得,即使有个别condition可以获得?
分享到:
评论
6 楼 z610 2008-03-20  
请大家讨论讨论,谢了。
5 楼 z610 2008-03-20  
一下是我的测试程序,如下所示,这个程序很快就会死锁,假如执行add函数的那个线程等待到了c1,c2,c3,c4,而执行rem()函数的那个线程等到了c7,c6,c5,这时就产生了死锁,我想问的是java中有没有一种机制保证,要么c1,c2,c3,c4,c5,c6,c7全部同时得到,要么就同时放弃,这样就避免了死锁的发生?
public class Test {
private int[] elems = new int[5];
Lock lock1 = new ReentrantLock(true);
Condition c1 = lock1.newCondition();
Condition c2 = lock1.newCondition();
Condition c3 = lock1.newCondition();
Condition c4 = lock1.newCondition();
Condition c5 = lock1.newCondition();
Condition c6 = lock1.newCondition();
Condition c7 = lock1.newCondition();
private int addIndex = 0;
private int remIndex = 0;
private int count = 0;

public void add(int i) {
lock1.lock();
try {
while (elems.length == count) {
try {
c1.await();
c2.await();
c3.await();
c4.await();
c5.await();
c6.await();
c7.await();
} catch (Exception e) {
e.printStackTrace();
}
}
elems[addIndex++] = i;
count++;
addIndex = addIndex % elems.length;
System.out.println(Thread.currentThread().getName()
+ " add  count=" + count);
c1.signal();
c2.signal();
c3.signal();
c4.signal();
c5.signal();
c6.signal();
c7.signal();
} finally {
lock1.unlock();
}
}

public int rem() {
int res = 0;
lock1.lock();
try {
while (0 == count) {
try {
c7.await();
c6.await();
c5.await();
c4.await();
c3.await();
c2.await();
c1.await();

} catch (Exception e) {
e.printStackTrace();
}
}
res = elems[remIndex++];

count--;
remIndex = remIndex % elems.length;
System.out.println(Thread.currentThread().getName()
+ " remove  count=" + count);

c7.signal();
c6.signal();
c5.signal();
c4.signal();
c3.signal();
c2.signal();
c1.signal();

} finally {
lock1.unlock();
}
return res;
}

public void start() {
for (int i = 0; i < 3000; i++) {
Thread t = new Thread(new producer(this));
t.start();
}
for (int i = 0; i < 3; i++) {
Thread t = new Thread(new consumer(this));
t.start();
}
}

/**
* @param args
*/
public static void main(String[] args) {
Test test = new Test();
test.start();
}
}

class producer implements Runnable {
Test t;

producer(Test t) {
this.t = t;
}

public void run() {
// TODO Auto-generated method stub
Random r = new Random();
while (true) {
int temp = Math.abs(r.nextInt() % 100);
if (temp < 10) {
// break;
}
t.add(temp);
try {
Thread.sleep(Math.abs(r.nextInt()) % 100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

}

class consumer implements Runnable {

Test t;

consumer(Test t) {
this.t = t;
}

public void run() {
Random r = new Random();
while (true) {
int temp = t.rem();

try {
Thread.sleep(Math.abs(r.nextInt()) % 100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

}
4 楼 pickerel 2008-03-20  
一个用CountDownLatch实现的MultiThreadManager
http://www.google.com/codesearch?hl=en&q=+MultiThreadManager+show:ZtTNYs-zcMM:m7pjry2CcK8:xoFWM7LeQ8c&sa=N&cd=1&ct=rc&cs_p=http://jira.codehaus.org/secure/attachment/17644/modules.zip&cs_f=utils/utils-lang-jar/src/main/com/barcoview/mis/utils/lang/thread/MultiThreadManager.java#first
使用示例

 try
 {
    // runables 是要运行的线程列表
    MultiThreadManager manager = new MultiThreadManager( runnables, "MyRunnables-" );
    manager.runAndWait();
 }
 catch( MultiThreadManagerException e )
 {
    MyLogicalException ex = (MyLogicalException)e.getCause();
 }

3 楼 yxbbing 2008-03-20  
rmn190 写道
通过Object类里的notify能不能得到解决呢?

好像另外还有关于线程的设计模式,我也记不大清了,希望这个链接可以有所帮助:http://hi.baidu.com/hibydu/blog/item/54e8d61f6bc99362f724e415.html

另处补充一句,那个博客是我刚粟出来的。

ding,
2 楼 rmn190 2008-03-20  
通过Object类里的notify能不能得到解决呢?

好像另外还有关于线程的设计模式,我也记不大清了,希望这个链接可以有所帮助:http://hi.baidu.com/hibydu/blog/item/54e8d61f6bc99362f724e415.html

另处补充一句,那个博客是我刚粟出来的。
1 楼 QuakeWang 2008-03-20  
不是很明白你的意思,你可以试试看java.util.concurrent.CountDownLatch是不是满足你的需求

相关推荐

    java多线程打字程序

    是一个java多线程打字程序,由于我们期末要用,所以到这里请教来了,你们这破网站还总政那个没用的麻烦不啊?

    java实验,包括源程序和题目要求(很详细)

    7. **多线程**:Java提供了强大的多线程支持,通过Thread类或Runnable接口可以实现并发执行。理解线程同步和互斥的概念,以及synchronized关键字、wait()、notify()方法的使用,是进行并发编程的基础。 8. **设计...

    java语言复习药店

    8. **多线程**: 复习线程的创建(通过Thread类或Runnable接口)、线程同步(synchronized关键字、wait/notify机制)、线程池等概念。 9. **网络编程**: Java提供了Socket编程接口,可以用于实现客户端和服务端的...

    java基础入门.docxjava基础入门.docx

    - **多线程支持**:Java内置了对多线程的支持,允许开发人员轻松地编写并发程序。 - **静态类型检查**:Java是一种静态类型语言,在编译阶段就会进行类型检查,有助于提前发现并解决类型错误。 #### 二、Java基础...

    2022年java学习心得体会例文.docx

    7. 线程:Java支持多线程编程,允许并发执行任务。线程管理是提高程序效率的重要手段,但同时也需要处理好同步和互斥问题,以避免数据竞争。 在学习过程中,保持信心、恒心和毅力至关重要。遇到困难时,不应轻易...

    Java自学之路——(精华版)

    6. 多线程:理解并发编程基础,学习Thread、synchronized关键字以及并发工具类。 7. JDBC数据库操作:学习如何连接和操作数据库,实现CRUD操作。 8. Java Swing或JavaFX:学习创建桌面应用程序的用户界面。 9. Java ...

    学不会的java消不了的忧愁

    3. **进阶难**:从入门到精通的过程非常漫长且充满挑战,特别是在高级特性如多线程、网络编程等方面,难度骤增。 4. **心理压力**:长时间的学习而无法看到显著进步容易让人产生挫败感,甚至放弃学习。 #### 三、...

    JAVA-GAME-SOURCE-CODE.rar_Java Game code

    8. **多线程**:为了提高性能,游戏可能会使用多线程来处理不同任务,比如一个线程负责渲染,另一个线程处理游戏逻辑。 9. **资源管理**:游戏中往往有音效、图片、字体等资源,Java中的`InputStream`和`...

    java实验代码

    实验11 多线程处理  实验12 I/O及文件处理  实验目的:掌握并使用Java中的I/O和文件。  心得体会:对于该实验,由于比较难,只是基本掌握了文件读写的方法和规则,还有待17周JAVA实训时继续攻坚克难。 ...

    北师珠信院Java期末考试复习题.zip

    14. **Chapter 14 - 多线程**:介绍线程的创建、同步机制(synchronized、wait/notify、ReentrantLock),以及线程池。 15. **Chapter 15 - 文件与文件流**:涉及文件的创建、读写、复制,以及文件流的操作。 16. ...

    Java面试考核目标.docx

    - 资深/专家:能够对现有代码进行优化,具有重构能力,熟悉多线程编程等高级特性。 2. **数据库、缓存、事务等** - **考核点**:熟悉关系型数据库原理,了解SQL优化方法,掌握缓存机制(如Redis)及事务管理。 -...

    java实训报告集锦7篇.docx

    1. Java多线程:在本实训中,使用Thread类创建显示时钟的线程,确保时钟动画的实时性。 2. GUI设计:运用Swing组件构建时钟界面,设置字体、颜色和布局,如使用JFrame、JLabel等。 3. 日历和时间处理:使用...

    Java面试必看

    2. **最深入研究的知识领域**:比如多线程编程、JVM调优等。 3. **积极的个性特征**:例如团队合作精神、抗压能力等。 4. **成功的案例或成就**:可以是项目中的亮点、解决的难题等。 5. **礼貌**:每次回答后都应...

    JAVA程序员的心得

    例如,在处理并发问题时,理解计算机系统的工作原理(包括操作系统、硬件架构等)对于解决死锁、线程安全等问题至关重要。此外,深入理解网络协议(如TCP/IP)、数据库原理等也可以帮助JAVA程序员更好地设计高性能的...

    Java心得 学JAVA必看

    这包括但不限于Java基础语法、面向对象编程思想、集合框架、多线程编程、异常处理等内容。只有建立了完整的知识框架,才能更好地理解和运用Java语言。 #### 3. 实践出真知 理论学习固然重要,但更重要的是实践。...

    Java Learning Path process外文文献.doc

    此外,还要掌握IO流、多线程、网络编程等核心知识。 第五步,学习Java的高级特性,如反射、注解、动态代理等,这些特性让Java在实际开发中更具灵活性和扩展性。 第六步,接触并理解设计模式。设计模式是软件工程中...

    JAVA数据库报告.docx

    - 支持多线程处理,提高并发处理能力。 - **数据库**:由于没有明确指出使用的数据库类型,可推测可能采用的关系型数据库有MySQL、Oracle或SQL Server等,这些数据库支持SQL标准,能够满足项目的功能需求。 #### ...

    java培训总结.doc

    此外,培训通常还会涵盖异常处理、集合框架、IO流、多线程、网络编程等关键领域,这些都是实际开发中不可或缺的部分。 在实训过程中,学员们不仅强化了理论知识,还提升了实践能力。实训项目使学员有机会将课堂上学...

    java实习日记和实习报告-4400字.docx

    - Java语言的优势在于其简单性、面向对象、多线程、分布性、跨平台和安全性,这些特性使得Java成为企业级应用开发的首选语言。 - 实习生首先学习了Java编程环境,包括编译器、解释器和开发工具如Visual J++,这有...

    基于JAVA的企业网站管理系统.doc

    在论文中,作者提到将Java理论知识应用于实际项目,这涵盖了Java的基础语法、类与对象、异常处理、多线程、集合框架、IO流等核心概念。在开发企业网站管理系统时,可能会涉及到数据库交互,因此Java的JDBC(Java ...

Global site tag (gtag.js) - Google Analytics