Java:两个线程,互相中断

时间:2012-09-13 07:37:27

标签: java multithreading interrupt

我想编写一个包含两个不同线程的代码。第一个做某事,第二个等待特定时间。首先结束的线程应该中断另一个线程。 我的问题是,我首先初始化的线程无法访问/中断第二个,它总是发出“未找到符号” - 错误。如果我在代码中交换线程的位置,它是相同的,只是反过来。 是否有可能使两个线程“全局”并且可以被另一个线程访问?请给出编码示例,在哪里放置public void main,void run()等,如果可能的话,所以我只需要添加代码本身。 感谢

代码示例:

    public class FTPUpload extends Thread {

      public static void main (String args[]) {
        _//some code_
        final Thread thread1 = new Thread(){;
          public void run() {
    _//code of thread1_
}  

final Thread thread2 = new Thread(){;
  public void run() {
   _//code of thread2_ 

}

thread1.start();
thread2.start();

       }
    }

4 个答案:

答案 0 :(得分:0)

对于你的问题(目前?)有点模糊,我的答案可能没那么有用。但是...

首先尝试声明Thread个对象,然后再使用它们。所以每个人都可能知道对方。

答案 1 :(得分:0)

您可以创建一个bool静态变量,它们都可以访问,一旦其中一个完成就将其设置为true,并且您必须在每个线程的作业期间检查此变量,或者在不同的位置或者如果您有一个循环例如,在循环中。

或者你可以通过第1个完成的线程在某处写一个虚拟文件,并继续检查两个线程中是否存在文件。主要想法是让共享资源都可以访问。

阅读此问题非常有用:Are static variables shared between threads?

我的想法可能无法达到某些答案,但带文件的答案实际上应该有效。

答案 2 :(得分:0)

两个线程之间通信的典型解决方案是使用条件变量。 Thread1可以阻塞条件变量,然后当Thread2完成它需要做的事情并想要告诉Thread1去时,它通过条件变量发出信号Thread1,从而释放它的块。必须使用相同的条件变量初始化两个线程。 Here就是一个例子。

如果您希望两个线程都等到另一个线程初始化,则可以使用屏障同步(在Java中称为CyclicBarrier)来执行此操作。如果Thread1首先命中屏障同步它将阻塞,直到另一个线程命中屏障同步。一旦两者都达到障碍同步,那么他们将继续处理。 Here就是一个例子。

条件变量和屏障同步都是线程安全的,因此您不必担心是否需要同步它们。

答案 3 :(得分:0)

一般原则是在两个线程之外创建一个锁和条件。第一个线程获取锁定并在完成时发出信号。第二个线程获取锁并等待条件(如果需要,使用超时)。我非常担心你依赖Thread.interrupt()这是一个糟糕的计划。

final Lock lock = new ReentrantLock();
final Condition done = lock.newCondition();
...
// in thread 1 when finished
lock.lock();
try {
  done.signalAll();
} finally {
  lock.unlock();
}
...
// in thread 2 for waiting
lock.lock();
try {
  done.await(30,TimeUnit.SECONDS); // wait for the done or give up waiting after 30s
} finally {
  lock.unlock();
}

使用锁定将确保两个线程都看到共享对象的一致视图,而Thread.interrupt()不保证您已经传递了边界

一项改进是使用CountDownLatch

final CountDownLatch latch = new CountDownLatch(1);
...
// in thread 1
latch.countDown();
...
// in thread 2
latch.await(30,TimeUnit.SECONDS)

这抽象了锁。

其他人已经建议有效地对文件系统上的文件进行自旋锁扫描。这样的方法可能导致线程饥饿或者性能比基于锁或锁存器的解决方案慢......但是对于进程间而不是一个jvm中的线程间,基于文件是好的

如果您认为线程进入书店,打开书籍并尝试预测第33页上的程序将会执行的操作,我推荐“Java Concurrency In Practice”一书......阅读完该页后,您将结束买这本书