Tag: multithreading

线程如何在Java中工作以及它们的工作方式与方法中的基本代码有何不同?

基本上这个代码有两个在两个类中创建的线程,它们是从第三个类中调用的。 每个线程都有一个循环,并在每次迭代后hibernate。 (代码到底) 输出是: CHECK 0 CHECK CHECK 1 CHECK run one in thread1 CHECK 2 CHECK run two in thread2 1)我不知道它为什么会这样运作。 我的意思是可以先打印CHECK 0 CHECK。 但是为什么CHECK 1 CHECK在Thread1之前打印(而在代码中调用Thread1之后),同样用于CHECK 2 CHECK和Thread2? 2)如果我用System.exit(0)替换CHECK 2 CHECK,就像上面的情况一样,在运行Thread2之前打印CHET 2 CHECK(它是Thread2旁边),为什么System.exit(0)发生在之后在这种情况下运行Thread2? 第二种情况的输出: CHECK 0 CHECK CHECK 1 CHECK run one in thread1 run two in thread2 请告诉我为什么会这样? 为什么方法中的线程和代码会以这种方式混淆? 我想我对java如何管理线程一无所知。 我试了很多,但找不到任何我能理解的东西。 码: […]

我的GUI被冻结了

我有一些我无法理解的东西:我的Swing GUI包含一个“播放”和“暂停”按钮。 我还有一个定义’ON’和’OFF’状态的静态变量。 (主程序生成GUI)。 通过克服’play’,我将静态变量的状态更改为’ON’,并在一个也修改GUI的线程中启动一个耗时的过程。 只要静态变量是’ON’循环在同一个进程中。 单击“暂停”会将静态变量更改为OFF。 但是通过点击“播放”,GUI就会冻结,因此: GUI不会更新 使用“暂停”按钮无法“暂停”此过程。 我听说过EDT和SwingWorker,但是我有一个简单的方法可以做到这一点。 谢谢你的帮助,原谅我的英语不好……

自定义Guice绑定注释与参数

我已经成功创建了一个Guice绑定注释,将单线程java.util.concurrent.ExecutorService实例注入到构造函数中。 这是一个示例用法: public class ContainsSingleThreadedExecutorService { private final ExecutorService executorService; @Inject public ContainsSingleThreadedExecutorService(@SingleThreaded ExecutorService executorService) { this.executorService = executorService; } } 我现在想为multithreading执行程序创建一个类似的注释,在注释中指定ThreadPool大小。 例如: public class ContainsMultiThreadedExecutorService { private final ExecutorService executorService; @Inject public ContainsMultiThreadedExecutorService(@MultiThreaded(poolSize = 5) ExecutorService executorService) { this.executorService = executorService; } } 有没有人知道如何从Guice提供程序访问“poolSize”参数的值?

我怎么能在一个线程中停止块方法DatagramSocket.receive()

我在主线程中创建一个DatagramSocket ,然后创建一个内部类线程来监听端口。 当我在主线程中关闭DatagramSocket时,它总是遇到一个错误的socket closed因为在内部类线程中我调用了receive()方法,并且它阻塞了内部类线程。 这是内部类的代码: class ReceiveText extends Thread { @Override public void run() { while(true) { byte[] buffer = new byte[1024]; DatagramPacket dp = new DatagramPacket(buffer, buffer.length); try { udpSocket.receive(dp);//blocked here byte[] data = dp.getData(); String message = new String(data, 0 , dp.getLength()); setTxtAreaShowMessage(message); } catch (IOException e) { e.printStackTrace(); } } } } […]

奇怪的InetAddress.isReachable()问题

我的工作是为零售环境开发适用于网络摄像机的软件。 我的团队正在开发的软件之一是一个网络服务器,它可以检索由摄像机本身(具有自己的嵌入式网络服务器)以HTML格式生成的各种报告并存储在摄像机上。 然后,我们的软件将从相机中获取这些报告并将其存储在中央网络服务器上。 虽然我们很好地将摄像机的IP插入到我们的软件中,但我正在开发一个简单的Java类,它将查询网络并找到网络上的所有摄像机。 但问题是,虽然它在我的PC和我的同事的PC上运行得很好,但是当我们尝试在将托管我们软件的实际网络服务器PC上运行它时…它会运行,但说子网中的每个IP都处于脱机状态/ unreachable除网关IP外。 例如,如果我在插入封闭的局域网时从我的PC或我的同事PC运行它,我会发现以下有效的IP以及一个告诉我它是否是相机的标志。 (网关是192.168.0.1,子网掩码是255.255.255.0,这意味着需要查找全部256个设备) IP:/192.168.0.1 Active:true Camera:false IP:/192.168.0.100 Active:true Camera:true <- this is camera 1 IP:/192.168.0.101 Active:true Camera:true <- this is camera 2 IP:/192.168.0.103 Active:true Camera:false <- my PC IP:/192.168.0.104 Active:true Camera:false <- this is our webserver 但出于某种原因,当使用相同的JRE从Web服务器PC运行相同的程序时,我只能找到以下内容 IP:/192.168.0.1 Active:true Camera:false 现在我的代码,而不是在主线程上按顺序枚举每个IP,而是为每个要检查的IP创建一个单独的线程并同时运行它们(否则在整个IP范围内枚举将花费21分钟以上)超时5000ms / IP)。 然后主线程反复每15秒重新运行这些IP扫描线程。 我已经检查过所有线程都在所有PC上运行完成,没有exception被抛出。 甚至证实没有线程被卡住。 每个线程从开始到完成大约需要5001到5050ms,那些具有活动IP的线程会更快完成(> 5000ms),所以我知道它在ipAddr.isReachable(5000)方法中正确等待了整整5000ms。 我和我的同事在这一点上很难过,而在我们的电脑上运行似乎可以达到那些活跃的IP,但是没有得到网络服务器PC的响应? 我们已经排除了防火墙问题,管理员访问问题等。唯一的区别是我们的网络服务器是嵌入式Win […]

不要同时在两个线程之间共享相同的套接字

我有大约60个套接字和20个线程,我想确保每个线程每次都在不同的套接字上工作,所以我不想在两个线程之间共享相同的套接字。 在我的SocketManager类中,我有一个后台线程,每60秒运行一次并调用updateLiveSockets()方法。 在updateLiveSockets()方法中,我迭代我拥有的所有套接字,然后通过调用SendToQueue类的send方法SendToQueue ping它们,并根据响应我将它们标记为活动或死亡。 在updateLiveSockets()方法中,我总是需要迭代所有套接字并ping它们以检查它们是活的还是死的。 现在,所有读者线程将同时调用SocketManager类的getNextSocket()方法,以获得下一个可用的套接字以在该套接字上发送业务消息。 所以我有两种类型的消息,我在套接字上发送: 一个是套接字上的ping消息。 这只是从调用SocketManager类中的updateLiveSockets()方法的计时器线程发送的。 其他是套接字上的business消息。 这是在SendToQueue类中完成的。 因此,如果pinger线程正在ping一个套接字以检查它们是否存在,那么没有其他业务线程应该使用该套接字。 类似地,如果业务线程使用套接字在其上发送数据,那么pinger线程不应该ping该套接字。 这适用于所有套接字。 但我需要确保在updateLiveSockets方法中,每当我的后台线程启动时,我们都会ping所有可用的套接字,以便我们可以确定哪个套接字是活的还是死的。 下面是我的SocketManager类: public class SocketManager { private static final Random random = new Random(); private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); private final Map<Datacenters, List> liveSocketsByDatacenter = new ConcurrentHashMap(); private final ZContext ctx = new ZContext(); // … private SocketManager() { connectToZMQSockets(); […]

如何在Java中停止不间断线程

我有一个我无法编辑的Java应用程序,它启动了一个具有此run()方法的java.lang.Thread : public void run(){ while(true){ System.out.println(“Something”); } } 在某个时间点我想阻止它。 如果我使用Thread.interrupt()它不起作用。 如果我使用Thread.stop()它可以工作,但不推荐使用此方法(因此不鼓励使用它,因为它可能会在新版本中从JVM中删除)。 如何在Java中停止这种不间断的线程?

使用PipedInputStream java编写end dead exception

在以下情况下发生写入结束exception:两个线程: A: PipedOutputStream put = new PipedOutputStream(); String msg = “MESSAGE”; output.wirte(msg.getBytes()); output.flush(); B: PipedInputStream get = new PipedOutputStream(A.put); byte[] get_msg = new byte[1024]; get.read(get_msg); 情况如下:A和B同时运行,A写入管道,B读取它。 B只是从管道中读取并清除了该管道的缓冲区。 然后A不会在未知的时间间隔内将msg写入管道。 但是,在某一时刻,B再次读取管道并发生java.io.IOException: write end dead ,因为管道的缓冲区仍为空。 而且我不想睡眠()线程B等待A写管道,这也是不稳定的。 如何避免这个问题并解决它? 谢谢

如何使用这两个线程和类A和B的对象创建死锁?

public class DeadLock { public static void main(String[] args) { final A a = new A(); final B b = new B(); new Thread(new Runnable(){ @Override public void run() { a.aMethod(b); } },”Thread-2″).start(); new Thread(new Runnable(){ @Override public void run() { b.bMethod(a); } },”Thread-2″).start(); } } class A { public void aMethod(B b) { System.out.println(“A […]

如何在Java中停止线程?

我用GUI创建了一个java程序,我想要一个停止按钮function,当用户点击停止按钮时,必须停止程序。 在我的程序中,主线程启动其他10个线程,我希望每当单击停止按钮时,必须在主线程之前停止所有10个线程。 其次,我还希望每当这10个线程的任何线程都被停止时,它必须首先关闭它之前打开的所有资源,比如连接到数据库等。 我已经实现了代码…….. 现在有一个问题。 我的线程类是这样的: public class ParserThread implements Runnable { private volatile boolean stopped = false; public void stopTheThread() { stopped = true; } : : } 以下是从函数start()启动10个线程的主线程 public class Main() { Thread [] threads; public void start() { for(int i = 0; i < 10; i++) { threads[i] = new Thread(new ParserThread()); […]