JAVA的infinite_无限线程java(infinite threads java)

无限线程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

...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值