如何使用4线程打印1到10,当打印10号线程时,通知所有其他线程终止。我想要这样的输出
t1 -1
t2 -2
t3 -3
t4 -4
t1 -5
t2 -6
t3 -7
t4 -8
t1-9
t2 -10
all thread stop我试过了,但我知道这不是正确的方法,有人能告诉我正确的方法吗?我在互联网上找不到正确的答案,如果有人告诉我正确的方法,那将是一个很大的帮助
public class NumberGame {
public static void main(String[] args) {
PrintSequenceRunnable.startFrom("T1");
new Thread(new PrintSequenceRunnable("T1", "T2")).start();
new Thread(new PrintSequenceRunnable("T2", "T3")).start();
new Thread(new PrintSequenceRunnable("T3", "T1")).start();
}
}
class PrintSequenceRunnable implements Runnable {
private final String name;
private final String next;
private static String moveTo;
private static int value = 1;
PrintSequenceRunnable(String name, String next) {
this.name = name;
this.next = next;
}
static void startFrom(String start) {
moveTo = start;
}
@Override
public void run() {
do {
synchronized (moveTo) {
if (name.equals(moveTo)) {
System.out.println(name + "-" + (value++));
moveTo = next;
} else {
uselessCounter++;
}
}
} while (value < 10);
}
}发布于 2019-09-13 00:22:55
首先,如果你使用并发搜索线程安全的变量,对象和其他。永远不要使用像这样的private static int value = 1;,而要使用原子变量,例如private static AtomicInteger value = new AtomicInteger(0);。在你完成你的工作之前,你会一直做你的工作。如果任务已经完成,则中断线程。我有一段代码
类PrintSequenceRunnable实现了Runnable {
private final String name;
private final String next;
private static String moveTo;
private static AtomicInteger value = new AtomicInteger(0);
PrintSequenceRunnable(String name, String next) {
this.name = name;
this.next = next;
}
static void startFrom(String start) {
moveTo = start;
}
@Override
public void run() {
do {
if (name.equals(moveTo) && value.get() < 10) {
System.out.println(name + "-" + (value.incrementAndGet()));
moveTo = next;
}
} while (value.get() < 10);
}}
public static void main (String[] args) {
PrintSequenceRunnable.startFrom("T1");
new Thread(new PrintSequenceRunnable("T1", "T2")).start();
new Thread(new PrintSequenceRunnable("T2" , "T3")).start();
new Thread(new PrintSequenceRunnable("T3", "T4")).start();
new Thread(new PrintSequenceRunnable("T4", "T1")).start();
}输出:
T1-1
T2-2
T3-3
T4-4
T1-5
T2-6
T3-7
T4-8
T1-9
T2-10发布于 2019-09-13 00:52:09
要让线程在单个工作“队列”中工作,请使用LinkedBlockingQueue。在这里,我下载了几个线程,然后从视频中创建了一个90秒的预览,然后我将其上传到亚马逊S3。另外,我使用的是BlockingLinkedQueue,也许你应该使用PriorityQueue,它会自动在队列中为你的物品排序。
每个线程从队列中拉出一个项目,没有冲突、锁定等。
BlockingQueue<String> filesToDownload = new LinkedBlockingDeque<String>(1024);
BlockingQueue<String> filesToPreview = new LinkedBlockingDeque<String>(1024);
BlockingQueue<String> filesToUpload = new LinkedBlockingDeque<String>(1024);
String currentYear = String.valueOf(Calendar.getInstance().get(Calendar.YEAR));
// DB connection.
DB db = new DB();
PreparedStatement st = null;
Connection conn = null;
conn = db.getConnection();
// get ids from ats_store.products.
try {
st = conn.prepareStatement(sql);
st.setString(1, currentYear);
ResultSet rs = st.executeQuery();
// add each id to IDS.
while (rs.next()) {
filesToDownload.add(rs.getString("product_id"));
filesToPreview.add(rs.getString("product_id"));
filesToUpload.add(rs.getString("product_id"));
}
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int recordSize = filesToDownload.size();
/**
* Here we can find out how many cores we have.
* Then make the number of threads NUMBER_OF_THREADS = the number of cores.
*/
NUMBER_OF_THREADS = Runtime.getRuntime().availableProcessors();
System.out.println("Thread Count: "+NUMBER_OF_THREADS);
/**
*
* CountDownLatch.we use this to block main until the working threads
* are done working.
*/
CountDownLatch startSignal = new CountDownLatch(1);
CountDownLatch doneSignal = new CountDownLatch(NUMBER_OF_THREADS);
// start up the Status Object class. For Reporting.
Thread statusThread = new Thread(new Status(filesToDownload, currentYear, recordSize, "DOWNLOADING..."));
statusThread.start();
/**
* prep downloader threads
*/
Thread[] workers = new Thread[NUMBER_OF_THREADS];
for (int x = 0; x < NUMBER_OF_THREADS; x++) {
workers[x] = new Thread(new S3ObjectDownloader(filesToDownload, currentYear, startSignal, doneSignal));
workers[x].start();
}
// start threads.
startSignal.countDown();
// block Main, wait for theads to complete.
try {
doneSignal.await();
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}https://stackoverflow.com/questions/57910339
复制相似问题