Java多线程等分卡分为4个线程
我试图通过实现代码片段来学习多线程。问题是使用4个线程(每个线程13个)在四个列表中分发卡片(52个),请在下面的代码中建议更好的解决方案或更正 由于这是针对多线程的实践,我没有对命名约定和泛型做太多强调(对此表示歉意)Java多线程等分卡分为4个线程,java,multithreading,Java,Multithreading,我试图通过实现代码片段来学习多线程。问题是使用4个线程(每个线程13个)在四个列表中分发卡片(52个),请在下面的代码中建议更好的解决方案或更正 由于这是针对多线程的实践,我没有对命名约定和泛型做太多强调(对此表示歉意) 为什么要重新发明轮子?新的JavaSE7提供了,它同时为您完成这项工作。添加一个指示当前线程周期的字段怎么样 static int turn = 0; 看一看 同步的详细信息 线程同步分为三个部分 1) 首先,线程必须在synchronized(ox)处获得锁。线程处于阻塞状
为什么要重新发明轮子?新的JavaSE7提供了,它同时为您完成这项工作。添加一个指示当前线程周期的字段怎么样
static int turn = 0;
看一看
同步的详细信息
线程同步分为三个部分
1) 首先,线程必须在synchronized(ox)
处获得锁。线程处于阻塞状态,直到保持器线程释放锁,然后线程尝试获取锁。如果它再次无法获得锁,它将再次处于阻塞状态
2) 当线程获得锁并进入synchronized
块时,它必须首先确定它是否真的能够获得锁或等待某些操作完成。因此,我们有一个循环来检查回合是否是线程的回合。如果不是,线程将自己置于等待状态,表示“我必须等待轮到它完成任务的线程”。然后,线程将保持等待状态,直到另一个线程用notifyAll
唤醒它。然后,它重新确定自己是否能够完成这项工作,如果不能,它将再次处于等待状态。否则,它就会完成它的工作
3) 最后,线程不会忘记在完成任务后使用
notfiyAll
唤醒其他等待的线程。如果它忘记了,其他线程将永远处于等待状态。此状态称为死锁,可能会导致程序挂起。只有一个Runnable
(例如CardDistributionTaskImplements Runnable
)的实现就足够了。每个线程都应该接收一个数字卡来分发。我认为方法应该是将数据组分成4个部分,让每个线程分配一个部分。一个更好的例子可能是有一个生产者线程将卡添加到阻塞队列
,还有四个消费者线程从该队列中拉出并写入自己的列表。这至少会让您了解线程调度是如何工作的。将使用BlockingQueue实现一个生产者和4个消费者,作为@parsifal comment的补充,使用ExecutorService
、Lock
和条件
,而不是这个“本机”线程。@BheshGurung假设如果我使用一个Runnable,我将如何获得list1、list2、list3、List4指针的hanks,将读取join Fork,但我正在试图理解如何使用Java多线程底层实现APIs@Naroji好啊请参考我的另一个答案
static int turn = 0;