无限线程java(infinite threads java)
我需要一个线程来检查JAVA桌面应用程序上的网络连接可用性。 我有一个这样的线程
class DataSyncThread extends Thread {
DataSyncThread() {
}
public void run() {
while(true){
try{
System.out.println("Checking for network");
InetAddress addr = InetAddress.getByName(host);
if(addr.isReachable(MIN_PRIORITY)){
syncData();
}
this.sleep(1000000);
}catch(Exception e){}
}
}
}
现在,当我在构造函数中调用它时,应用程序永远不会加载。 当我查看控制台(我触发jar从中加载)线程工作时,它在控制台中打印“正在检查网络”。
帮助赞赏
I need to have a thread which checks for network connection availability on a JAVA desktop app. I got a thread like this
class DataSyncThread extends Thread {
DataSyncThread() {
}
public void run() {
while(true){
try{
System.out.println("Checking for network");
InetAddress addr = InetAddress.getByName(host);
if(addr.isReachable(MIN_PRIORITY)){
syncData();
}
this.sleep(1000000);
}catch(Exception e){}
}
}
}
Now when I call this in the constructer the app never loads. when I look into the console (I trigger the jar to load from it) the thread work, it prints "Checking for network" in the console.
help appreciated
原文:https://stackoverflow.com/questions/8292007
更新时间:2019-12-05 18:51
最满意答案
我的猜测是你正在做的事情:
DataSyncThread thread = new DataSyncThread();
thread.run();
这将同步 run()方法。 您应该调用start()来创建一个单独的执行线程:
DataSyncThread thread = new DataSyncThread();
thread.start();
我还建议实现Runnable而不是扩展Thread - 或者很可能使用Timer ,因为你需要定期执行。 我希望你的真实代码也登录你的catch块...
My guess is that you're doing something like:
DataSyncThread thread = new DataSyncThread();
thread.run();
That will run the run() method synchronously. You should be calling start() to create a separate thread of execution:
DataSyncThread thread = new DataSyncThread();
thread.start();
I would also recommend implementing Runnable instead of extending Thread - or quite possibly using a Timer instead, given that you want periodic execution. I hope your real code has logging in your catch block, too...
2011-11-28
相关问答
要创建线程,创建一个扩展Thread类的新类,并实例化该类。 扩展类必须重写run()方法并调用start()方法才能开始执行线程。 在run()里面,你将定义构成一个新线程的代码。 理解run()可以调用其他方法,使用其他类并像主线程一样声明变量很重要。 唯一的区别是run()为程序中的另一个并发执行线程建立入口点。 这将在run()返回时结束。 public class MyThread extends Thread {
String word;
public MyThread(S
...
您正在寻找的是一种非阻塞数据结构 ,比如ConcurrentLinkedQueue 。 它将接受队列中的条目并向其发出请求而不会阻塞,使得使用它非常简单而不实现任何花哨的东西。 进一步阅读 (进入非阻塞背后的理论) “高效实用的非阻塞数据结构”,H˚akanSundell “证明非阻塞算法不会阻塞”,Alexey Gotsman等人 What you are looking for is a non-blocking data structure, say ConcurrentLinkedQueu
...
来自测试程序的简单线程转储显示以下线程 - 一个是应用程序线程,然后您有另外8个JVM线程: Full thread dump Java HotSpot(TM) Client VM (14.0-b16 mixed mode):
"Low Memory Detector" daemon prio=6 tid=0x0aad6c00 nid=0x9c0 runnable [0x00000000]
java.lang.Thread.State: RUNNABLE
"CompilerThread0
...
在Linux上,Java线程使用本机线程实现,因此使用线程的Java程序与使用线程的本机程序没有什么不同。 “Java线程”只是属于JVM进程的线程。 在现代的Linux系统(一个使用NPTL)上,属于进程的所有线程具有相同的进程ID和父进程号,但不同的线程ID。 您可以通过运行ps -eLf来查看这些ID。 PID列是进程ID,PPID列是父进程ID,LWP列是线程(LightWeight Process)ID。 “主”线程具有与进程ID相同的线程ID,并且其他线程将具有不同的线程ID值。 较旧
...
我的猜测是你正在做的事情: DataSyncThread thread = new DataSyncThread();
thread.run();
这将同步 run()方法。 您应该调用start()来创建一个单独的执行线程: DataSyncThread thread = new DataSyncThread();
thread.start();
我还建议实现Runnable而不是扩展Thread - 或者很可能使用Timer ,因为你需要定期执行。 我希望你的真实代码也登录你的catch块
...
您需要在监视器上同步线程。 例如(使用当前对象作为监视器): public void processRefreshEvent(ManagerEvent event){
//processing event
//...
//I'm done
synchronized(this) {
notify(); // you are basically notifying any thread who has blocked
...
在存储上创建一个同步方法,在接受存储时返回true。 像这样的东西... public synchronized boolean store ( int num) {
if ( items < capacity ) {
items ++;
return true;
}
return false;
}
Create a synchronised method on storage which returns true on accept
...
这取决于线程是否已被标记为“守护进程”。 当JVM退出时,守护线程将被终止。 如果有任何线程不是守护进程,那么JVM根本不会退出。 它会等待这些线程先完成。 默认情况下,线程采用父线程的守护进程状态。 主线程将守护进程设置为false因此由它分化的任何线程也将为false 。 在线程开始之前 ,您可以将守护程序标志设置为true : Thread thread = new Thread(...);
thread.setDaemon(true);
thread.start();
It depend
...
阻塞队列可能( http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/BlockingQueue.html )? 主线程可以阻塞,直到部分结果到达,然后更新总数。 A blocking queue maybe ( http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/BlockingQueue.html )? The main thread can block o
...
实现这一目标的一个解决方案是使用CountDownLatch ,让主线程等待其计数达到零,并使两个线程各自减少计数(在这种情况下,计数的初始值将为1)。 One solution to accomplish that is with a CountDownLatch, by having the main thread wait for its count to reach zero, and having the two threads each decrease the count (the
...