Java 如何实例化同一对象的两个线程,并让对象打印不同的内容

Java 如何实例化同一对象的两个线程,并让对象打印不同的内容,java,multithreading,Java,Multithreading,目标:所以我有一个可运行的类。我实例化了这两个线程。一个打印“这个”,一个打印“那个”。主类不应该确定它打印的内容 问题:如何使默认构造函数为同一类的两个线程设置两个不同的输出?有什么可以改进的?我怎样才能让它只打印这个或那个,而不是同时打印这两者 期望的最终结果是一个运行约10秒并打印10次这个或那个的程序。当前输出为“this”“that”,同时等待约10秒,然后重复10次 import java.util.Random; public class ThisThat implements

目标:所以我有一个可运行的类。我实例化了这两个线程。一个打印“这个”,一个打印“那个”。主类不应该确定它打印的内容

问题:如何使默认构造函数为同一类的两个线程设置两个不同的输出?有什么可以改进的?我怎样才能让它只打印这个或那个,而不是同时打印这两者

期望的最终结果是一个运行约10秒并打印10次这个或那个的程序。当前输出为“this”“that”,同时等待约10秒,然后重复10次

import java.util.Random;


public class ThisThat implements Runnable {

private String output;
private int threadNum;

public ThisThat() {
    output = "";
}
 public ThisThat(int t_Num) { 
    threadNum = t_Num;
    setThisOrThat(threadNum);
}


public void setThisOrThat(int num) {
    if (num == 1) {
        output = "this";
    } else if (num == 2) {
        output = "that";
    } else {
        Random random = new Random();
        int randNum = random.nextInt((3) + 1);
        setThisOrThat(randNum);
    }
}
@Override
public void run() {
         for (int i=1; i <= 10; i++) {
                         try {
                             System.out.println(getOutput());
                            Thread.sleep((int)(800));
                          }
                            catch(InterruptedException e) {
                                 System.err.println(e);
                          }   

             }


  }


public String getOutput() { return output; }
public void setOutput(String output) { this.output = output; }

}

class Main {

public static void main(String args[]) {


  Thread thread1 = new Thread(new ThisThat(1));
  Thread thread2 = new Thread(new ThisThat(2)); 

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

 }
import java.util.Random;
实现Runnable的公共类{
私有字符串输出;
私有int-threadNum;
公共财政{
输出=”;
}
公共this(int t_Num){
threadNum=t_Num;
设置threadNum(线程数);
}
公共无效设置thisortat(int num){
如果(num==1){
output=“this”;
}else if(num==2){
output=“that”;
}否则{
随机=新随机();
int randNum=random.nextInt((3)+1);
SetThisortat(randNum);
}
}
@凌驾
公开募捐{

对于(int i=1;i一个解决方案是更新构造函数,使其不接受
Main
中的任何内容,然后在
ThisThat
类中创建一个静态
volatile
原子
属性,该属性基本上是一个计数器,用于更改每个线程实例的值。

您能否详细说明所需的最终结果是什么不清楚这段代码有什么不起作用。好吧,我只想使用
public this(字符串输出){this.output=output;}
random.nextInt((3)+1)
应该是
random.nextInt(2)+1;
,否则您有时会使用参数值0或3递归调用,导致另一个递归调用。@Tom,他说主类不应该确定线程打印的内容。您对此有什么样的示例吗?我不熟悉这个线程的东西,我正试图遵循它,但我并不真正理解它。@gatorade2131-阅读已被接受的答案,差异非常具体。请看