-1

我想用两个不同的线程编写代码。第一个做某事,第二个等待特定的时间。首先结束的线程应该中断另一个线程。我现在的问题是,我首先初始化的线程无法访问/中断第二个线程,它总是给出“找不到符号”-错误。如果我在代码中交换线程的位置,它是相同的,只是相反。是否有可能使两个线程都“全局”并且可由另一个线程访问?请给出编码示例,如果可能的话,将 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

4 回答 4

0

因为您的问题(目前?)有点模糊,我的回答可能没有那么有帮助。但...

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

于 2012-09-13T07:41:14.423 回答
0

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

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

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

于 2012-09-13T08:00:39.223 回答
0

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

或者,您可以在第一个完成的线程的某处写入一个虚拟文件,并继续检查两个线程中是否存在文件。主要思想是拥有一个双方都可以访问的共享资源。

阅读这个问题非常有用:线程之间是否共享静态变量?

我的想法可能无法达到某些答案,但有文件的那个应该确实有效。

于 2012-09-13T07:44:37.750 回答
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 中的进程间而不是线程间,基于文件是可以的

如果你认为你知道线程,我推荐《Java 并发实践》这本书去书店,打开这本书并尝试预测第 33 页的程序会做什么......读完那页之后你最终会买这本书

于 2012-09-13T08:07:47.147 回答