Tag: multithreading

通过调用start()和run()来运行Thread,有什么区别?

这可能是一个基本问题,我对此感到困惑, 在一个文件中,我喜欢这样: public class MyThread extends Thread { @Override public void run() { //stuffs } } 现在在另一个文件中我有这个: public class Test { public static void main(String[] args) { Thread obj = new MyThread(); //now cases where i got confused //case 1 obj.start(); //it makes the run() method run //case 2 obj.run(); //it is also making run() […]

使用Logger和FileHandler Class of Java.util时,几秒钟后日志文件没有更新

我使用以下类’LoggerUtil’来记录到控制台和文件’logfile.log’。 记录到控制台工作正常。 但是,记录到’logfile.log’文件在几个日志后停止。 任何有关查找错误的建议都会受到欢迎。 我附上以下代码: public class LoggerUtil { public static final String LOGGERNAME = “project.logging”; static { try { Logger.getLogger(LOGGERNAME).setUseParentHandlers(false); Handler ch = new ConsoleHandler(); Handler fh = new FileHandler(“logfile.log”); SimpleFormatter sf = new SimpleFormatter(); fh.setFormatter(sf); Logger.getLogger(LOGGERNAME).addHandler(ch); Logger.getLogger(LOGGERNAME).addHandler(fh); setHandlersLevel(Level.ALL); } catch (IOException | SecurityException ex) { Logger.getLogger(LoggerUtil.class.getName()).log(Level.SEVERE, null, ex); } } public static void […]

在单独的线程中创建ServerSocket?

我在我的应用程序中使用ServerSocket遇到问题。 我正在我的应用程序的构造函数中创建ServerSocket 。 套接字的构造函数调用accept()方法等待客户端连接。 问题是accept()方法冻结了我的整个应用程序,直到客户端连接。 所以我想问一下,如果在一个单独的线程中创建整个ServerSocket是否有另一种选择,那么在我的主应用程序旁边调用ServerSocket的构造函数及其accept()方法? 编辑: 感谢Olivier的建议,将.accept放入runnable并创建一个线程池来处理客户端连接。 这就是我现在的代码: public void start(){ final ExecutorService clientProcessingPool = Executors.newFixedThreadPool(10); Runnable serverTask = new Runnable() { @Override public void run() { try { serverSocket = new ServerSocket(port); while (true) { Socket clientSocket = serverSocket.accept(); objectout = new ObjectOutputStream(clientSocket.getOutputStream()); clientProcessingPool.submit(new ClientTask(clientSocket,objectout)); } } catch (IOException e) { System.err.println(“Accept failed.”); […]

为什么SwingWorker意外停止?

我想用SwingWorker尝试一些想法,因为我没有太多使用它。 相反,我遇到了一个问题,我无法弄清楚出了什么问题。 这是一个简短的SSCCE来演示这个问题(我知道这里的人就像SSCCEs): import javax.swing.SwingUtilities; import javax.swing.SwingWorker; public class SwingWorkerTest { public static void main (String[] args) { SwingUtilities.invokeLater (new Runnable () { @Override public void run () { new MySwingWorker (500).execute (); new MySwingWorker (900).execute (); new MySwingWorker (1200).execute (); } }); } } class MySwingWorker extends SwingWorker { private int ms; public MySwingWorker […]

如何将基于回调的API转换为基于Observable的API?

我正在使用的库使用回调对象发出一系列Message对象。 interface MessageCallback { onMessage(Message message); } 使用一些libraryObject.setCallback(MessageCallback)调用添加回调,并使用非阻塞libraryObject.start()方法调用启动该进程。 创建将发出这些对象的Observable的最佳方法是什么? 如果libraryObject.start()阻塞怎么办?

并行化for循环

我有一个for循环,迭代时的计算i不依赖于前一次迭代中的计算。 我想并行化for循环(我的代码在java中),以便多个迭代的计算可以在多个处理器上同时运行。 我应该为每次迭代的计算创建一个线程,即要创建的线程数等于迭代次数(for循环中的迭代次数是多少)? 这个怎么做?

java中的静态变量和multithreading

是一个类的静态成员,每个进程或线程只显示一个实例? 每个线程的含义是否有自己的类的静态成员变量的副本? 我的猜测是按程序进行的,我是否正确?

在java中并行化任务的最简单方法是什么?

说我有一个类似的任务: for(Object object: objects) { Result result = compute(objects); list.add(result); } 并行化每个compute()的最简单方法是什么(假设它们已经可并行化)? 我不需要一个严格符合上述代码的答案,只是一般答案。 但是如果您需要更多信息:我的任务是IO绑定的,这是针对Spring Web应用程序的,任务将在HTTP请求中执行。

如何在没有任何用处的情况下停止永远运行的线程

在下面的代码中,我有一个while(true)循环。 考虑到try块中存在一些代码的情况,其中线程应该执行一些约需一分钟的任务,但是由于某些预期的问题,它正在运行。 我们可以阻止那个线程吗? public class thread1 implements Runnable { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub thread1 t1 = new thread1(); t1.run(); } @Override public void run() { // TODO Auto-generated method stub while(true){ try{ Thread.sleep(10); } catch(Exception e){ e.printStackTrace(); } } } }

将ThreadLocal传播到从ExecutorService获取的新线程

我使用ExecutorService和Future( 这里是示例代码)在一个具有超时的单独线程中运行进程(线程“生成”发生在AOP方面)。 现在,主线程是Resteasy请求。 Resteasy使用一个或多个ThreadLocal变量来存储我需要在Rest方法调用中的某个时刻检索的一些上下文信息。 问题是,由于Resteasy线程在新线程中运行,因此ThreadLocal变量将丢失。 将Resteasy使用的任何ThreadLocal变量“传播”到新线程的最佳方法是什么? 似乎Resteasy使用多个ThreadLocal变量来跟踪上下文信息,我想“盲目地”将所有信息传递给新线程。 我已经查看了子类化ThreadPoolExecutor并使用beforeExecute方法将当前线程传递给池,但我找不到将ThreadLocal变量传递给池的方法。 有什么建议吗? 谢谢