Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java多线程等分卡分为4个线程_Java_Multithreading - Fatal编程技术网

Java多线程等分卡分为4个线程

Java多线程等分卡分为4个线程,java,multithreading,Java,Multithreading,我试图通过实现代码片段来学习多线程。问题是使用4个线程(每个线程13个)在四个列表中分发卡片(52个),请在下面的代码中建议更好的解决方案或更正 由于这是针对多线程的实践,我没有对命名约定和泛型做太多强调(对此表示歉意) 为什么要重新发明轮子?新的JavaSE7提供了,它同时为您完成这项工作。添加一个指示当前线程周期的字段怎么样 static int turn = 0; 看一看 同步的详细信息 线程同步分为三个部分 1) 首先,线程必须在synchronized(ox)处获得锁。线程处于阻塞状

我试图通过实现代码片段来学习多线程。问题是使用4个线程(每个线程13个)在四个列表中分发卡片(52个),请在下面的代码中建议更好的解决方案或更正

由于这是针对多线程的实践,我没有对命名约定和泛型做太多强调(对此表示歉意)


为什么要重新发明轮子?新的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;