Java线程可以执行不同的任务吗?
我正在看一个示例,其代码是:Java线程可以执行不同的任务吗?,java,multithreading,concurrency,Java,Multithreading,Concurrency,我正在看一个示例,其代码是: class SimpleThread extends Thread { public SimpleThread(String str) { super(str); } public void run() { for (int i = 0; i < 10; i++) { System.out.println(i + " " + getName()); try { sleep
class SimpleThread extends Thread {
public SimpleThread(String str) {
super(str);
}
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(i + " " + getName());
try {
sleep((int)(Math.random() * 1000));
} catch (InterruptedException e) {}
}
System.out.println("DONE! " + getName());
}
}
我的问题是:每个线程都有自己的代码吗?例如,一个线程递增一个变量,而另一个线程递增另一个变量。
谢谢
另外,示例的链接是:SimpleThread的每个实例都有自己的本地类存储。只要您没有使用标记为
static
的字段,那么每个线程都将“执行自己的代码”。在线程之间同步值要困难得多
例如:
class SimpleThread extends Thread {
// this is local to an _instance_ of SimpleThread
private long sleepTotal;
public SimpleThread(String str) {
super(str);
}
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(i + " " + getName());
try {
long toSleep = Math.random() * 1000;
// add it to our per-thread local total
sleepTotal += toSleep;
sleep(toSleep);
} catch (InterruptedException e) {}
}
System.out.println("DONE! " + getName());
}
}
类SimpleThread扩展线程{
//这是SimpleThread的_实例u的本地
私人长眠总;
公共SimpleThread(字符串str){
超级(str);
}
公开募捐{
对于(int i=0;i<10;i++){
System.out.println(i+“”+getName());
试一试{
long-toSleep=Math.random()*1000;
//将其添加到每个线程的本地总数中
sleepTotal+=toSleep;
睡眠(toSleep);
}捕获(中断异常e){}
}
System.out.println(“完成!”+getName());
}
}
我是Java和线程新手,但是你可以这样做(这可能不是很有效),但是使用if语句检查线程的id或getName(),如果它等于特定线程的名称,那么就这样做
比如说:
int i;
int j;
if ("thread 2".equals(Thread.currentThread().getName())){
i++;
System.out.println("this is thread 2");
}
else {
j++;
...
}
这应该允许您使线程在同一run()方法下运行不同的任务它们不是已经在这样做了吗…?嗯,它们不是都在这样循环吗?我看不出他们的任务有什么不同。也许下面的内容更容易理解:Thread1执行A,B,C Thread2执行D,E,F我现在看到的是它们都执行run()中的内容。对不起,我只是一个初学者。他们都在做循环,但他们自己的副本。因此线程1中的
i
与线程2中的i
完全无关。它们彼此独立地循环和处理,即使它们做的基本上是完全相同的事情。我要找的是,他们不会做完全相同的事情。这被认为是正确的还是我误解了多线程?如果您想让他们做两件不同的事情,请创建两个不同的类来扩展Thread
,并实现不同的run()
方法。或者,您可以将一个参数传递到定义其功能的线程中,例如processType=0或1。两个线程是否共享并执行run()中的相同代码?如果是,它们是否可能执行不在同一方法run()中的不同任务?例如,thread1执行A、B、C,thread2执行D和E。共享相同的代码是@Blagovest,但不共享相同的字段存储。@Blagovest如果希望它们运行不同的任务,则可以指定不同的run()
方法或不同的Thread
类。您还可以将一些值传递给构造函数,run()
方法可以使用它来确定它应该是od A、B、C还是D、E。
int i;
int j;
if ("thread 2".equals(Thread.currentThread().getName())){
i++;
System.out.println("this is thread 2");
}
else {
j++;
...
}