我的屏幕录制应用程序中有一个线程无法配合:
package recorder;
import java.awt.AWTException;
import java.awt.Insets;
import java.io.IOException;
import javax.swing.JFrame;
public class RepeatThread extends Thread {
volatile boolean stop;
public volatile Thread recordingThread;
JFrame frame;
int count = 0;
RepeatThread( JFrame myFrame ) {
stop = false;
frame = myFrame;
}
public void run() {
while( stop == false ) {
int loopDelay = 33; // 33 is approx. 1000/30, or 30 fps
long loopStartTime = System.currentTimeMillis();
Insets insets = frame.getInsets(); // Get the shape we're recording
try {
ScreenRecorder.capture( frame.getX() + insets.left,
frame.getY() + insets.top, frame.getWidth()
- ( insets.left + insets.right ),
frame.getHeight() - ( insets.top + insets.bottom ) );
}
catch( AWTException e1 ) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
catch( IOException e1 ) {
// TODO Auto-generated catch block
e1.printStackTrace();
} // Add another picture
long loopEndTime = System.currentTimeMillis();
int loopTime = (int )( loopEndTime - loopStartTime );
if( loopTime < loopDelay ) {
try {
sleep( loopDelay - loopTime ); // If we have extra time,
// sleep
}
catch( Exception e ) {
} // If something interrupts it, I don't give a crap; just
// ignore it
}
}
}
public void endThread() {
stop = true;
count = 0;
ScreenRecorder.reset();
// Once I get this annoying thread to work, I have to make the pictures
// into a video here!
}
}
多年来一直困扰着我。它会定期将屏幕截图带到指定区域。
当您开始录制时,它会隐藏(缩小)窗口。在Mac上,当您以应用程序为焦点时,所有隐藏的窗口都会激活。在我的课程中WListener
(我已经确认可以工作),我有:
public void windowActivated(WindowEvent e){
if(ScreenRecorder.recordingThread!= null){
ScreenRecorder.recordingThread.endThread();
}
}
所以应该发生的是,当他单击应用程序时,截屏线程将停止。但是,我必须残酷地搞砸一些东西,因为当线程运行时,它甚至不会让窗口重新出现。这是我的第一个话题,所以我期待这样的怪异问题。你知道怎么了吗
编辑:好的,我使stop变为volatile,这是我创建线程的地方:
package recorder;
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
public class ScreenRecorder {
static RepeatThread recordingThread;
static int count;
public static void record(JFrame frame) {
if(recordingThread == null) { //Make a new thread if we don't have one
recordingThread = new RepeatThread(frame);
recordingThread.start();
}
}
public static void capture(int x, int y, int width, int height) throws AWTException, IOException {
// capture the whole screen
//BufferedImage screencapture = new Robot().createScreenCapture(
// new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()) );
BufferedImage screencapture = new Robot().createScreenCapture(
new Rectangle( x, y, width, height));
// Save as JPEG
File directory = new File("/Users/stuart/Movies/temp");
if(directory.exists() == false) {
directory.mkdirs();
}
count ++;
File file = new File("/Users/stuart/Movies/temp/screencapture" + count + ".jpg");
ImageIO.write(screencapture, "jpg", file);
// Save as PNG
// File file = new File("screencapture.png");
// ImageIO.write(screencapture, "png", file);
}
public static void stop() {
}
public static void reset() {
count = 0;
}
}
因为您显然试图每X毫秒执行一个工作单元,所以如果使用Java的Executor,这将容易得多:
ScheduledExecutorService service = executors.newSingleThreadScheduledExecutor();
service.scheduleAtFixedRate(new Runnable() {
public void run() {
// do one iteration of your work
ScreenRecorder.capture(...);
...
}
}, 0L, 33L, TimeUnit.MILLISECONDS);
...
service.shutdown(); // to stop
手动执行操作并Thread
没有您做的那么麻烦(不是在挖洞,只是说在Java中并不那么糟糕),但是以上内容仍然是最简单的选择。
我通过创建固定数量的线程来使用执行器服务来进行HTTP GET数据检索。 当Tomcat停止时,我们会出现以下错误: 严重:web应用程序[/viewer]似乎已启动名为[ThreadExecutor_51616156]的线程,但未能停止该线程。这很可能会造成内存泄漏。 这是真的吗?在没有这些服务错误的情况下,如何正确停止tomcat。
我已经查看了这里给出的一些ANWER,但我没有得到解决我问题的确切方法:我不想创建一个新的类并扩展runnable或Thread。 我有一个服务,它在创建时必须每10秒检查一些东西,并且所需的调用不能从主线程执行,所以在StartCommand()方法中我执行以下操作: 现在,当我调用onStopService()时,我想停止这个线程。方法stop()不推荐使用,因此我使用中断(): 正如我预期的
我正在为这个问题寻找一个干净的设计/解决方案:我有两个线程,可以运行用户想要的时间,但最终会在用户发出停止命令时停止。然而,如果其中一个线程突然终止(例如,由于运行时异常),我想停止另一个线程。 现在,这两个线程都执行一个(因此,当我说“stop a thread”时,我的意思是对实例调用一个stop()方法),我想的是避免使用线程(thread类),并使用interface,然后将这两个Runn
我在尝试停止运行多个线程的程序时遇到了问题,所有运行的线程都试图找到相同的解决方案,但一旦一个线程找到了解决方案,所有其他线程都将停止。 在main方法中,我创建了一个线程组,使用for循环向其中添加线程并启动它们 在实现Runnable的类中,我很难找出如何使其实现,以便一旦其中一个线程找到解决方案,所有线程都将停止。最终发生的情况是,要么其他线程继续运行,有时这些线程会相互中断并相互覆盖。
问题内容: 我正在编写一段连接到服务器的代码,使用该连接会生成一堆线程并执行一堆“工作”。 在某些情况下,连接失败,我需要停止所有操作并从头开始创建新对象。 我想在对象之后进行清理,但在线程上调用thread.stop,但是此方法似乎已被弃用。 推荐的替代方法是什么?是否应该为每个线程编写自己的清理和退出方法?将线程设置为null?或者是其他东西? 问题答案: 看这里 : 在HowToStopAT