Tag: multithreading

访谈:如何确保一个接一个的线程运行?

有线程T1 , T2和T3 ,我们怎样才能确保线程T2在T1之后运行而线程T3在T2之后运行? 我的采访中提到了这个问题。 我没回答。 请详细解释。

如何在java执行器类中停止所有可运行的线程?

final ExecutorService executor = Executors.newFixedThreadPool(1); final Future future = executor.submit(myRunnable); executor.shutdown(); if(executor.awaitTermination(10, TimeUnit.SECONDS)) { System.out.println(“task completed”); }else{ System.out.println(“Executor is shutdown now”); } //MyRunnable method is defined as task which I want to execute in a different thread. 这是run者类的run方法: public void run() { try { Thread.sleep(20 * 1000); } catch (InterruptedException e) { // TODO Auto-generated […]

清除Thread.interrupt()标志的方法

我最近inheritance了一个几乎没有Thread安全性的大型Java应用程序。 我目前正在研究的是让所有线程正确处理被中断而不是使用非常糟糕的Thread.stop() 。 问题的一部分是我不知道每个方法调用清除中断标志。 目前我知道以下将清除中断标志: Thread.interrupted() Thread.sleep(long) Thread.join() Thread.join(long) Object.wait() Object.wait(long) 我还缺少什么? 谢谢

从多个线程进行Java日志记录的最佳实践?

我想要一个由管理数据的几个任务生成的诊断日志。 这些任务可能在多个线程中。 每个任务都需要将一个元素(可能带有子元素)写入日志; 进去快点出去。 如果这是一个单任务的情况,我会使用XMLStreamWriter,因为它似乎是简单/function的最佳匹配,而不必在内存中保存一个膨胀的XML文档。 但这不是一个单任务的情况,我不确定如何最好地确保这是“线程安全”,其中“线程安全”在这个应用程序中意味着每个日志元素应该正确和连续地写入日志(一个后另一个,不以任何方式交错)。 有什么建议么? 我有一个模糊的直觉,要走的路是使用一个日志元素队列(每个元素都可以快速生成:我的应用程序正在忙于执行对性能敏感的实际工作),并且有一个单独的线程来处理日志元素并将它们发送到文件,以便日志记录不会中断生成器。 日志记录不一定必须是XML,但我确实希望它是结构化的和机器可读的。 编辑:我把“threadsafe”放在引号中。 Log4j似乎是一个显而易见的选择(对我来说很新但对社区来说很老),为什么重新发明轮子……

停止特定的java线程

我有一个按钮“addCashier”,它正在创建一个名为“Cashier”的线程,现在这个线程只是每4秒生成一次订单,在线程的run()方法中有一个while(true)循环。 一切都很好,但现在我想添加一个按钮来模拟收银员注销。 我在我的while循环onDuty和一个公共函数logOff()中添加了一个布尔变量,它将onTuty bool设置为false以使我退出运行的while循环。 我现在的问题是来自我的gui类如何在特定线程上调用函数? 每个收银员线程都是在运行时生成的,所以我不知道他们的名字。 我希望我有道理。 提前致谢。

订购线程按照创建/启动的顺序运行

我如何按照实例化的顺序订购线程。如何让下面的程序按顺序打印数字1 … 10。 public class ThreadOrdering { public static void main(String[] args) { class MyRunnable implements Runnable{ private final int threadnumber; MyRunnable(int threadnumber){ this.threadnumber = threadnumber; } public void run() { System.out.println(threadnumber); } } for(int i=1; i<=10; i++){ new Thread(new MyRunnable(i)).start(); } } }

中断或停止睡眠线程

如何在java中停止或中断睡眠线程? 我有一个同步数据并在run()方法中hibernate10分钟的线程,如果我想通过在线程hibernate时停止线程来停止同步。 怎么能实现这一目标?

为什么Swing线程模型被认为是错误的,应该如何?

我多次听说Java Swing线程模型是错误的。 我不完全理解为什么,我知道这个问题与你可以从主UI线程以外的另一个线程Drawable这一事实有关。 我知道有一些实用function,如SwingUtilities.invokeAndWait和SwingUtilities.invokeLater ,可以让你在Runnable绘制,而Runnable则由Event Dispatcher线程运行。 我猜这种方式可以确保绘画是同步完成的,这不会使缓冲区处于不稳定的状态。 我的问题是 :“好”的UI工具包如何表现? 采用了哪些解决方案?

确保按顺序采用Java同步锁?

我们有两个线程通过synchronized方法访问一个列表。 我们可以吗 a)依靠运行时间来确保每个人都可以根据他们尝试的顺序或方式接收方法 b)VM是否遵循任何其他规则 c)是否有更好的方法来序列化请求?

为什么Java没有看到来自另一个线程的更新值?

请查看此代码(摘自Effective Java book) import java.util.concurrent.TimeUnit; public class Main { private static boolean stopReq; public static void main(String[] args) throws InterruptedException { Thread bgw = new Thread(new Runnable() { public void run(){ int i = 0; while(!stopReq){ i++;} } }); bgw.start(); TimeUnit.SECONDS.sleep(1); stopReq = true; } } 为什么bgw线程陷入无限循环? 它stopReq在到达循环时缓存了自己的stopReq副本? 所以它永远不会看到来自其他线程的更新值? 我理解这个问题的解决方案是同步或volatile变量,但我很好奇为什么这个当前的实现不起作用。 谢谢