Tag: multithreading

扩展Thread类时如何调用run()方法

同时浏览java.lang.Thread类的源代码。 奇怪的是我想看看Thread类如何调用run()方法(用户定义的run())。 当我实现如下的Runnable接口时 Thread waiterThread = new Thread(waiter, “waiterThread”); waiterThread.start(); 在Thread类的构造函数的上面代码中,正在调用init()方法,并从那里开始将Runnable实例初始化为this.target = target 。 从start()方法start()它们调用一个native方法start0() ,这可能会调用Thread类的run()方法,这会导致用户定义的run()方法执行。 以下是Thread类的run()方法实现: @Override public void run() { if (target != null) { target.run(); } } 我的问题是当我们扩展java.lang.Thread类时,以及当我们调用start()方法时,如下所示。 public class HelloThread extends Thread { public void run() { System.out.println(“Hello from a thread!”); } public static void main(String args[]) { (new HelloThread()).start(); } […]

java中的低效线程

我目前有一些问题需要理解为什么在某些情况下,Java中的并行化似乎效率低下。 在下面的代码中,我构建了4个使用ThreadPool执行的相同任务。 在我的Core i5(2核,4线程)上,如果我将工作器数设置为1,则计算机需要大约5700ms并使用25%的处理器。 如果我将worker的数量设置为4,那么我会观察100%的CPU使用率,但是…计算的时间是相同的:5700ms,而我预计它会低4倍。 为什么? 这是正常的吗? (当然我的真正任务更复杂,但这个例子似乎重现了这个问题)。 提前谢谢你的答案。 这是代码: public class Test { public static void main(String[] args) { int nb_workers=1; ExecutorService executor=Executors.newFixedThreadPool(nb_workers); long tic=System.currentTimeMillis(); for(int i=0; i<4;i++){ WorkerTest wt=new WorkerTest(); executor.execute(wt); } executor.shutdown(); try { executor.awaitTermination(1000, TimeUnit.SECONDS); } catch (InterruptedException e) {e.printStackTrace();} System.out.println(System.currentTimeMillis()-tic); } public static class WorkerTest implements Runnable { @Override public […]

如何杀死java线程?

我谷歌杀死java线程的解决方案。 并且存在两种解决方案: 设置一面旗帜 使用Thread.interrupt 但他们两个都不适合我。 在我的post中,我称第三方api需要很长时间才能完成。 如果需要花费太多时间,我想让用户取消这个post。 那我怎么能杀掉这个post呢? 提前致谢。

Java中的并发字节数组访问,尽可能少的锁

我正在尝试减少分段数据的锁定对象的内存使用量。 在这里和这里看我的问题。 或者假设你有一个字节数组,每16个字节可以(de)序列化为一个对象。 我们将其称为行,行长度为16个字节。 现在,如果您从编写器线程修改这样的行并从多个线程读取,则需要锁定。 如果你的字节数组大小为1MB(1024 * 1024),这意味着65536行和相同数量的锁。 这有点太多了,我还需要更大的字节数组,我想把它减少到大致与线程数成比例的东西。 我的想法是创造一个 ConcurrentHashMap concurrentMap; 其中Integer是行索引,在线程“输入”行之前,它会在此映射中放置一个锁定对象(从这个答案中得到了这个想法)。 但无论我怎么想,我都找不到真正的线程安全的方法: // somewhere else where we need to write or read the row LockHelper lock1 = new LockHelper(); LockHelper lock = concurrentMap.putIfAbsent(rowIndex, lock1); lock.addWaitingThread(); // is too late synchronized(lock) { try { // read or write row at rowIndex eg writing like […]

如何按顺序在ExecutorService中执行任务?

我有三个连接的线程,即第二个线程在第一个死后执行。 这是我的代码: public class Main { public static void main(String args[]) throws Exception { final Thread thrdA = new Thread(() -> System.out.println(“Message 1”)); final Thread thrdB = new Thread(() -> System.out.println(“Message 2”)); final Thread thrdC = new Thread(() -> System.out.println(“Message 3”)); thrdA.start(); thrdA.join(); thrdB.start(); thrdB.join(); thrdC.start(); thrdC.join(); } } 如何使用ExecutorService而不是三个线程对象实现此function?

什么是类级别,对象级别,显式和内部锁定?

我一直在经历Javamultithreading概念。 我经历的越多,我就越困惑。 现在我不理解Java中的类级别,对象级别,显式锁定和内部锁定之间的差异。 有人可以让我知道这是什么? 另外,如果我能得到一些例子来理解,那对我来说非常有帮助。

如何在java中给出默认的新线程名称?

当我运行这个程序 public class Fabric extends Thread { public static void main(String[] args) { Thread t1 = new Thread(new Fabric()); Thread t2 = new Thread(new Fabric()); Thread t3 = new Thread(new Fabric()); t1.start(); t2.start(); t3.start(); } public void run() { for(int i = 0; i < 2; i++) System.out.print(Thread.currentThread().getName() + " "); } } 我得到输出 Thread-1 […]

Java servlet是否可以安全地生成线程以满足请求?

我的Java(Tomcat 8)Web服务器是否可以安全地生成线程以响应HTTP请求? 我正在看post和论坛,有些人说这绝对没问题 ,其他人说不要这样做 。 我的用例是这样的: protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { … … final MyResult res = new MyResult(); Thread first = new Thread(new Runnable() { @Override public void run() { // put this into res } }); Thread second = new Thread(new Runnable() { @Override public void run() { […]

你如何在一行中挂起Java中的一个线程?

一行我的意思是每行最多100个字符。 (我基本上需要这个来保持程序活着。主线程注册在不同的线程中运行的回调监听器。我只需要主要的一个永久挂起并让其他线程完成他们的工作)

Hashmap坚持得到

我对HashMap有一个奇怪的问题。 有多个线程访问相同的hashmap(不是线程安全)。 有时候,这个过程会被卡住。 当我检查线程堆栈时,我看到许multithreading处于状态: java.lang.Thread.State: RUNNABLE at java.util.HashMap.get(HashMap.java:303) 注意这种情况非常罕见。 并且无法按需复制。 为什么会卡住? hashmap上没有同步。 键是字符串