Tag: multithreading

当一些循环执行长任务时如何中断线程?

可能重复: 你如何杀死Java中的线程? 我需要通过向线程发送中断信号来停止执行一些大任务。 我正在使用java.util.concurrent。*中的大多数API。 我的任务是发送到线程并执行。 此任务来自客户端,因此我无法控制该代码。 任务类似于: public class Task1 extends Thread { public void run() { while(true){ if(Thread.interrupted()){ return; } for(int i=0; i<Integer.MAX_VALUE; i++){ System.out.println("I am task 1 " + i); } } } }; 我希望在接收到中断信号时基本上停止循环for-loop(请注意我不能将Thread.interrputed()逻辑放在for循环中,因为它来自客户端。)我有另一个使用它的类执行程序执行此任务。 public class ConcurrentTest { public static void main(String[] args) { // TODO Auto-generated method stub ConcurrentTest test = […]

如何使用Hibernate JPA线程安全进行数据库访问?

我想知道我需要做什么才能访问数据库线程安全。 这是我的Entity类: @Entity @Table(name = “students”) @NamedQuery(name = “Student.getAll”, query = “SELECT s FROM Student s”) public class Student { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; @Column(length = 32, name = “name”) private String name; // … constructor, getters and setters, toString … } 这是DbService类: public class DbService { public EntityManager em = Persistence […]

停止ServerSocket accept()循环线程

我正在实现一个非常基本的API来更好地控制ServerSocket和Sockets,但是由于我缺乏线程知识,我处理的是一个非常奇怪的问题。 让我解释一下。 在我的类SocketStreamReceiver中,我使用辅助线程来监听带有ServerSocket#accept()新套接字。 有两种方法:start()和stop()客户端可以用来启动(创建一个线程并开始用accept()监听)并停止(关闭ServerSocket并销毁线程)我的SocketStreamReceiver。 你将如何实现stop()方法? 请记住,stop()可以在doSomething()内部调用,在start()启动的同一个辅助线程中。 您可以更改任何所需内容:如果需要,可以在线程内创建ServerSocket,就在while(运行)之前。 public class SocketStreamReceiver{ … private Thread thread; private ServerSocket server; private boolean running; … public void start () throws IOException{ if (thread != null) return; server = new ServerSocket (port); thread = new Thread (new Runnable (){ @Override public void run (){ try{ while (running){ Socket socket = […]

这个线程程序每次都会显示不同的答案

这是一个Java程序,用于查找1-500000中具有最大除数的数字。 public class Medium2 { static int count1 = 1; static int count2 = 1; static int big_count = 0; static int big = 0; 主要方法 public static void main(String[] args) { Runnable runnable1 = new Runnable() { public void run() { 实施在这里 for (int num = 1; num <= 500000; num++) { for (int […]

定期数据库批量插入的Java并发

场景:每秒调用一个线程数千次,以便对同一个表进行插入,并且当前正在逐个执行这些操作。 目标:定期进行批量插入以提高性能。 当线程的saveItem方法被调用时,尝试使用TimerTask来将保存的对象添加到列表中,然后每隔2秒左右将它们组合成批量插入。 首先想到的是有两个列表,称之为toSave和toSaveBackup 。 当调用线程的saveItem方法来保存它时,它将被添加到toSave列表中,但是一旦TimerTask启动并需要将所有内容保存到数据库,它就会将AtomicBoolean标志saveInProgress设置为true。 saveItem检查此标志,如果saveInProgress为true,它将添加到toSaveBackup而不是toSave。 批量保存完成后,toSaveBackup中的所有项目都将移动到toSave列表,可能是列表上的同步块。 这是一种合理的方法吗? 还是有更好的最佳做法? 我的谷歌搜索技能让我失望,所以欢迎任何帮助。 其他信息: 所有这些插入都在同一个表中 插入是通过接收MQTT消息来驱动的,因此在此之前我无法将它们组合在一起 更新:对CKing以下答案的调整达到了预期的方法:TimerTask每100毫秒运行一次并检查saveQueue的大小以及自批量保存以来的时间。 如果这些值中的任何一个超过配置的限制(每2秒或每1000条记录保存等),我们就会保存。 LinkedBlockingQueue用于简化同步。 再次感谢大家的帮助!

子线程阻止java中的父线程

public static void main(String[] args) throws Exception { new Thread(new Runnable() { public void run() { while(true) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(“Hello”); } } }).run(); System.out.println(“Bye”); } 在主要的thead中,我创建了一个新的线程,它将每秒打印“你好”。 为什么最后的“再见”从未打印过? 换句话说,为什么子线程阻塞主线程?

如何以multithreading方式调用不同类的相同方法

我在我的两个类中有一个名为process的方法,比如说CLASS-A and CLASS-B 。 现在在下面的循环中,我调用我的两个类的process method顺序意义一个接一个,它工作正常,但这不是我想要的方式。 for (ModuleRegistration.ModulesHolderEntry entry : ModuleRegistration.getInstance()) { final Map response = entry.getPlugin().process(outputs); // write to database System.out.println(response); } 有什么办法,我可以用multithreading方式调用我的两个类的进程方法。 这意味着一个线程将调用CLASS-A的进程方法,第二个线程将调用CLASS-B的进程方法。 之后我想将process方法返回的数据写入数据库。 所以我可以再写一个线程来写入数据库。 下面是我以multithreading方式提出的代码,但不知何故它根本没有运行。 public void writeEvents(final Map data) { // Three threads: one thread for the database writer, two threads for the plugin processors final ExecutorService executor = Executors.newFixedThreadPool(3); final […]

使用线程处理套接字

我正在开发一个基本上是聊天室的java程序。 这是一个课程的分配,所以没有代码请,我只是有一些问题确定最可行的方式来处理我需要做的事情。 我已经为单个客户端设置了一个服务器程序,使用线程获取数据输入流和一个线程来处理数据输出流上的发送。 我现在需要做的是为每个传入请求创建一个新线程。 我的想法是创建一个链表来包含客户端套接字,或者可能包含线程。 我磕磕绊绊的地方是弄清楚如何处理将消息发送给所有客户。 如果我为每个传入消息都有一个线程,那么我该如何转身并将其发送到每个客户端套接字。 我想如果我有一个客户端套件的链表,那么我可以遍历列表并将其发送给每个,但是每次我都必须创建一个dataoutputstream。 我可以创建dataoutputstream的链接列表吗? 对不起,如果它听起来像我在漫无目的,但我不想只是开始编码,如果没有一个好的计划,它可能会变得混乱。 谢谢! 编辑我决定发布我到目前为止的代码。 我还没有机会测试它,所以任何评论都会很棒。 谢谢! import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; import java.net.ServerSocket; import java.util.LinkedList; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; public class prog4_server { // A Queue of Strings used to hold out bound Messages // It blocks till on is available static […]

在java中是否有Thread.sleep的替代品

这是我的代码 while (true) { try { Thread.sleep(5 * 60 * 1000); processData();// data processing job } catch (InterruptedException e) { SystemMessageBillPay.getInstance().writeMessage(“ERROR: CEB.run() – ” + e.getMessage()); } catch (NumberFormatException e) { SystemMessageBillPay.getInstance().writeMessage(“ERROR: CEB.run() – ” + e.getMessage()); } } 对此 “Thread.sleep(5 * 60 * 1000);” 代码检查员发出警告 “在循环中调用Thread.sleep会导致性能问题” 什么应该是防止此警告的代码

在Java中用另一个线程的run方法中断一个线程

我正在阅读这篇文章,并给出了从另一个线程中断一个线程的建议 “”如果正确实施,以下是一些应该有效的方法。 您可以让两个threads定期检查一些常见的标志变量(例如将其命名为stopNow),并安排两个线程在完成时设置它。 (标志变量需要是易失性的……或者是正确同步的。) 您可以让两个threads定期调用Thread.isInterrupted()方法来查看它是否已被中断。 然后每个线程在完成时需要在另一个线程上调用Thread.interrupt()。“” 我不明白第二种方法是如何使用Thread.isInterrupted() 。 也就是说, Thread-1如何在Thread-2上调用Thread.interrupt() 。 考虑这个例子,在main方法中我启动两个threads t1和t2 。 我希望t1在达到某个条件后停止t2 。 我该怎么做到这一点? class Thread1 extends Thread { public void run(){ while (!isDone){ // do something } } //now interrupt Thread-2 } class Thread2 extends Thread { public void run(){ try { while(!Thread.isInterupted()){ //do something; } catch (InterruptedExecption e){ //do something […]