0
import java.lang.Thread;

class ThreadExperiment implements Runnable {
  public static void main(String[] args) {
    Thread t = new Thread(new ThreadExperiment());
    @Override
    public void run(){      
        do {
            num ++;
            try {
                Thread.sleep(400);
            } catch (InterruptedException e){
            }
        } while (num >= 0);
    }

    Thread t2 = new Thread(new ThreadExperiment());
    @Override
    public void run() {
        do {
            num2--;
            try {
                Thread.sleep(400);
            } catch (InterruptedException e){
            }
        } while (num >= 1);
    }


    int num = 1;
    int num2 = 10;
    t.start();
    t2.start();
    if (num == num2) {
        t.interrupt();
        t2.interrupt();
    }
  }
}

试图修补线程并转圈,总是如此接近。我想要两个线程,一个增加数字计数,另一个减少数字计数。如果他们相遇,我希望他们停下来。但是,我在使用 public void run() 时遇到了麻烦-目前,它说我t have a semi-colon next to both of them. What isn不对?这是放置 public void run() 的正确位置吗?

另外,一些网站说我需要两个单独的类来创建线程——这有什么原因吗?也许如果一个线程依赖于另一个线程的计算但走不同的路线,我可以理解,但我的感觉不同,只是两个独立的实体。

最后,我需要导入声明吗?

4

3 回答 3

1

首先,您的代码看起来应该有很多编译错误,这表明我可能会以错误的方式进行编码。如果您不能使用 IDE,那么您必须尽早并经常编译,并且在修复所有编译错误之前不要再添加任何新代码。

例如,您似乎有一个方法 run,嵌入在另一个方法 main 中,而您根本无法做到这一点。我建议你重新开始,从一个可以编译的小代码骨架开始,然后再早点经常编译。还可以在 main 方法之外获取大部分代码。不,run 方法不在正确的位置,因为您应该只有一个run 方法,它应该在类本身中,而不是嵌入在 main 或任何其他方法中。

关于,

最后,我需要导入声明吗?

你的编译器会告诉你:去掉导入,看看会发生什么。

于 2013-02-23T02:40:13.770 回答
1

1)。您希望您的代码能够编译。

您的编译问题是因为您要在 main 方法中声明您的运行方法。分离你的方法声明,然后只使用 main 来创建和运行你的线程。

2)。您希望有两个线程同时运行。

这意味着我们需要定义两个不同的线程类或一个具有逻辑来处理递增和递减的线程。Andrew Mao 的回答让您开始了解如何定义两个单独的线程。我上面的代码使用了一个 run 方法的单一定义,该方法使用一个参数来确定走哪条路。

3)。您希望两个线程同时处理相同的数据,因为当它们分别递增/递减时,它们需要检查冲突。

一个简单的方法是在 main 方法中创建您想要处理的对象(num1 和 num2),然后将这些对象的引用传递给您的线程。我上面的代码中的示例。

4)。你想测试一些东西

假设所有 java.lang.* 都是自动导入的。为了清楚起见,将其放在那里没有害处,但您选择的开发工具上的自动导入器命令可能会将其删除为多余的。

public class ThreadExperiment implements Runnable {
    /* these fields are unique to each instance of ThreadExperiment */
    private int increment = 0;

    /* these are used to point to the original num1 and num2 instances created in your main method */ 
    private Integer myNumber;
    private Integer theOtherNumber;


/** 
 * Constructor.   
 */
public ThreadExperiment(int increment, Integer num1Ref, Integer num2Ref) {
    this.increment = increment;
    this.myNumber = num1Ref;
    this.theOtherNumber = num2Ref;
}


@Override
public void run() {
    do {
        myNumber += increment;
        try {
            Thread.sleep(400);
        } catch (InterruptedException e) {
        }
        System.out.println(Thread.currentThread().getName() + " -- " + myNumber);
    } while (!myNumber.equals(theOtherNumber));
}


/** 
 * Your static main method used to instantiate & start threads 
 */
public static void main(String[] args) {
    Integer num1 = 0;
    Integer num2 = 10;

    Thread t = new Thread(new ThreadExperiment(1, num1, num2), "Thread 1");
    Thread t2 = new Thread(new ThreadExperiment(-1, num2, num1), "Thread 2");
    t.start();
    t2.start();
}

}
于 2013-02-23T02:48:46.640 回答
0

线程实现的run方法需要在一个单独的类中。您当然可以将其中一个放在您的ThreadExperiment班级中,但不能两者兼而有之。在这种情况下,您可以将两个线程分成内部类:

class ThreadExperiment {

  static int num = 1;
  static int num2 = 10;

  class Thread1 implements Runnable {
    @Override
    public void run(){      
        do {
            num++;
            try {
                Thread.sleep(400);
            } catch (InterruptedException e){
            }
        } while (num >= 0);
    }
  }

  class Thread2 implements Runnable {
    @Override
    public void run() {
        do {
            num2--;
            try {
                Thread.sleep(400);
            } catch (InterruptedException e){
            }
        } while (num >= 1);
    }
  }

  public static void main(String[] args) {

    Thread t = new Thread(new Thread1());    
    Thread t2 = new Thread(new Thread2());    

    t.start();
    t2.start();

    if (num == num2) {
        t.interrupt();
        t2.interrupt();
    }
  }
}

现在我们到了某个地方,但您仍然需要解决一些逻辑问题:

  • ints 设为静态并不是一个好习惯。(但是对于这个测试场景来说没关系。)
  • 您的num == num2检查只会发生一次,并且无法保证发生这种情况时会出现什么值。线程被中断的可能性很小。
  • 您需要声明ints volatile,因为它们将被不同的线程读取。
  • 中的while条件Thread1将导致无限循环。
于 2013-02-23T02:42:45.130 回答