这是我第一次使用这个网站......只要告诉我我做错了什么。
Verk3a
上课:
package verk3a;
public class Verk3a {
public static int n = 100;
public static void main(String[] args) {
RunMeSumThread Zack = new RunMeSumThread(n);
RunMeSumThread John = new RunMeSumThread(n);
RunMeSumThread Konni = new RunMeSumThread(n);
Zack.start();
John.start();
Konni.start();
}
}
RunMeSumThread
上课
package verk3a;
public class RunMeSumThread extends Thread implements Runnable{
public RunMeSumThread(int n) {
for (int i = 0; i < n; i++) {
System.out.print(i);
System.out.print(" | ");
System.out.print(Thread.currentThread().getName());
System.out.println();
}
}
}
它总是会回复:
0 | main
1 | main
2 | main
3 | main
4 | main
5 | main
6 | main
等...
我正在尝试让它同时运行多个线程。我做错了什么?
答案 0 :(得分:5)
您应该在void run
方法中实现线程执行的代码。只需将逻辑从类构造函数移动到run
方法即可。这是一个例子:
public class RunMeSumThread extends Thread implements Runnable{
int n;
public RunMeSumThread(int n) {
this.n = n;
}
@Override
public void run() {
for (int i = 0; i < n; i++) {
System.out.print(i);
System.out.print(" | ");
System.out.print(Thread.currentThread().getName());
System.out.println();
}
}
}
此外,对于线程创建,您应该从Thread
类扩展或实现Runnable
接口,它可以同时执行两者。
如果您从Thread
延伸,则无需实施Runnable
界面。如果您只实施Runnable
,则应创建Thread
个实例并传递Runnable
的实例。在代码中(根据您的代码改编):
public class RunMeSumThread implements Runnable{
int n;
public RunMeSumThread(int n) {
this.n = n;
}
@Override
public void run() {
for (int i = 0; i < n; i++) {
System.out.print(i);
System.out.print(" | ");
System.out.print(Thread.currentThread().getName());
System.out.println();
}
}
}
public class Verk3a {
public static int n = 100;
public static void main(String[] args) {
//create a Thread and pass an instance of the class implementing Runnable here
Thread zack = new Thread(new RunMeSumThread(n));
Thread john = new Thread(new RunMeSumThread(n));
Thread konni = new Thread(new RunMeSumThread(n));
zack.start();
john.start();
konni.start();
}
}
答案 1 :(得分:3)
在您调用线程的start
方法之前,并未真正创建新的“线程”(在操作系统级别)。由于您在构造函数中进行打印,因此它总是在主线程上执行。
答案 2 :(得分:0)
您已在构造函数中添加了这些打印件。
System.out.print(i);
System.out.print(" | ");
System.out.print(Thread.currentThread().getName());
System.out.println();
因此它会在创建对象时打印输出。
注意:在调用方法start
之前,它是一个简单的java对象
答案 3 :(得分:0)
应将Runnable
的实现传递给Thread
的超级构造函数:
public class RunMeSumThread extends Thread
{
public RunMeSumThread(final int n)
{
super(new Runnable()
{
@Override
public void run()
{
for (int i = 0; i < n; i++)
{
System.out.print(i);
System.out.print(" | ");
System.out.print(Thread.currentThread().getName());
System.out.println();
}
}
});
}
}