草庐IT

Java 线程终止引用

为什么不能通过将线程的引用设置为null并让垃圾收集器删除它来终止线程?它和其他对象一样,不是吗?示例:Threadt=newThread(newRunnable(){publicvoidrun(){//...}}).start;t=null; 最佳答案 It'sanobjectlikeanyother,isn'tit?不,不是。它代表一个非内存资源。您是否希望一个文件被删除,因为代表它的对象被垃圾回收了?事实上,当谈到垃圾回收时,Thread对象非常不“像任何其他”对象,因为线程本身就是可达性树,因此表示正在运行的线程的Threa

java - 如何启动和管理Java线程?

下面的代码工作正常,但我想知道..从概念上讲,它是否正确?启动线程,等待它们加入。应该使用ThreadPool吗?如果可以,请评论Listthreads=newArrayList();for(Testtest:testsToBeExecuted){Threadt=newThread(test);threads.add(t);t.start();}for(Threadthread:threads){thread.join();} 最佳答案 概念上看起来不错。您可以使用您创建的ExecutorService:ExecutorServic

java - Find out if the calling thread is the SWT UI thread - 确定调用线程

我有这个模块用于应用程序COMM的多个部分(在SWTUi端、后端等)。这个模块有一个sendMessage方法,我想在其中添加一个例程来确定调用线程(只是为了在UI中使用它)是SWTUI线程。并警告程序员,他正在尝试从UI线程执行耗时的操作……这很糟糕:)当然,我想通过不在UI模块(来自COMM)上添加任何依赖项来做到这一点。如何确定调用线程是否是SWTUI线程?谢谢,米尔恰 最佳答案 您可以调用Display.getThread()来获取应用程序的当前UI线程。如果您不想依赖SWTUI,那么您将不得不使用反射。例如:publics

Java同步混淆

抱歉,如果这非常明显或已在其他地方得到回答。我什么也没找到。我有以下代码:publicclassSimpleThreadextendsThread{publicstaticIntegersharedVal=0;publicSimpleThread(){}@Overridepublicvoidrun(){while(true){iterator();}}publicvoidtheSleeper(){System.out.println("Thread:"+this.getId()+"isgoingtosleep!");try{this.sleep(5000);}catch(Excepti

java - 如何在 Eclipse 调试透视图中识别线程?

我正在开发一个有一些线程的Java应用程序。我在控制台中打印threadId,例如17、18、19等等。但是当我打开调试透视图时,我有这个“调试”窗口(最左上角的窗口),它显示了当前线程,但它们使用[Thread-2]、[thread-3]。数字不一定与ThreadId匹配。有什么方法可以将我在控制台中获得的ThreadId与“调试”窗口中显示的线程相关联? 最佳答案 我不知道有什么办法可以做到这一点。然而,还有另一种方法。这些线程名称由您正在使用的Thread构造函数自动生成。但是,有一个名为Thread.setName()的方法

java - 使用 Thread.sleep 线程 hibernate 时的 CPU 消耗

我有一个服务器程序可以轮询数据库以获取新请求,我希望每隔1分钟进行一次轮询,所以我在程序中设置了一个Thread.sleep()while循环。问题是每当这个程序应该“hibernate”时,CPU消耗就会急剧上升(即大约25-30%)。矛盾的是,当程序不处于hibernate状态,忙于处理请求时,CPU消耗下降到0.4%。我在网上阅读并发现与thread.sleep相关的性能下降,但我找不到任何可行的替代方案(Thread.wait需要通知对象,我觉得这在我的场景中是无用的)主循环(当没有新请求时)不做任何事情,这是当CPU消耗为25%时正在做的所有事情的框架->投票->没有新记录?

java - 与 java 线程不一致的结果

我有一个实现runnable的线程类和一个作为实例变量的int计数器。两个同步方法add和sub。当我以某种方式运行我的测试类时,它会打印几次错误的结果。据我了解,当一个方法被同步时,整个对象将被锁定以供其他线程访问,每次我们都应该得到相同的结果时使用这种逻辑吗?有些情况并非如此。我错过了什么吗?我的机器是Windows7,64位。publicclassThreadClassimplementsRunnable{intcounter=0;@Overridepublicvoidrun(){add();sub();}publicsynchronizedvoidadd(){System.ou

java - Java 中的 Thread.Sleep 替代方案

有人告诉我,使用Thread.Sleep()有时是一个糟糕的解决方案,因为人们想要在同步方法的Action循环中设置一些时间间隔。另一方面,我有两个不同的线程,它们在我的程序运行期间处于Activity状态,还有一个共享对象,当我在该共享对象中使用Object.wait(long)时,它会导致我的GUI卡住一些时间。对于这个问题,什么是更好的解决方案?更新这部分代码包括在GUI中启动的线程之一:classtemperatureUpextendsThread{@Overridepublicvoidrun(){while(true){try{GBC.increaseTemp();updat

java - 添加没有 Thread.sleep 的延迟和 while 循环什么都不做

我需要在不使用Thread.sleep()或while循环的情况下添加延迟。即时编辑游戏(Minecraft)时钟以“滴答声”运行,但它们会根据您的FPS波动。publicvoidonTick(){//Calledevery"Tick"if(variable){//Ifmyvariableistrueboolean=true;//Settingmybooleantotrue/***Doingabunchofthings.**///Ineedadelayforaboutonesecondhere.boolean=false;//Settingmybooleantofalse;}}我需要延

java - 线程池执行器 : how does it reuse threads

我读到ThreadPoolExecutor有线程池,这个池注定要降低创建新线程的成本(至少我是这样理解下面的短语):Whenyousendatasktotheexecutor,ittriestouseapooledthreadfortheexecutionofthistask,toavoidcontiniousspawningofthreads.[Java7ConcurrencyCookbook]但是,据我所知,我们无法在Java中重新启动线程。问题:ThreadPoolExecutor如何避免创建新线程? 最佳答案 这很简单-本质