分析以下代码,要实现多个线程一起完成打印1-3数据的功能,完成横线处缺失部分的代码() class MyThread implements Runnable { private int num = 3; @Override public void run() { while (true) _____________请选择正确的选项__________ { if (num == 0) break; else { System.out.println(Thread.currentThread().getName() + " - " + num); num--; } } } } MyThread my=new MyThread(); Thread t1=new Thread(my) Thread t2=new Thread(my) T1.start() my.run() T2.start() my.run() class MyThread extends Thread{} MyThread th1=new MyThread(); MyThread th2=new MyThread(); th1.start() th1.run() th2.start() th2.run() synchronized (MyThread.class) synchronized (this) synchronized () lock.lock();
时间: 2024-03-04 07:50:57 浏览: 110
正确的选项应该是 synchronized (this)。因为多个线程要共享同一个 Runnable 对象 my,所以需要使用同步锁来保证线程安全。synchronized (this) 表示使用当前对象 my 作为锁,只有获得锁的线程才能执行其中的代码,其他线程需要等待。而 synchronized (MyThread.class) 则是使用 MyThread 类作为锁,这样会限制所有 MyThread 的对象同时只能执行一个代码块,与本题的需求不符。synchronized() 是无法通过编译的,lock.lock() 则需要在代码中显式地释放锁,容易出现死锁等问题,不太适合此处的场景。
相关问题
package step1; public class CreateThreadPractice { public static void main(String[] args) { MyThread myThread = new MyThread(); // ---------------------Begin------------------------ //开启线程 // ---------------------End------------------------ } } // ---------------------Begin------------------------ //继承Thread编写名为MyThead的类,代码内容为循环输出10遍: 线程在运行...... // ---------------------End------------------------
请看下面的代码:
```java
package step1;
public class CreateThreadPractice {
public static void main(String[] args) {
MyThread myThread = new MyThread();
// ---------------------Begin------------------------
//开启线程
myThread.start();
// ---------------------End------------------------
}
}
// ---------------------Begin------------------------
//继承Thread编写名为MyThead的类,代码内容为循环输出10遍: 线程在运行......
class MyThread extends Thread {
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("线程在运行......");
}
}
}
// ---------------------End------------------------
```
这段代码创建了一个名为 MyThread 的类,它继承自 Thread 类,实现了线程的功能。在主方法中,我们创建了 MyThread 的实例,并通过调用 start() 方法来启动线程。在 MyThread 类中,我们重写了 run() 方法,该方法定义了线程的行为。在本例中,我们只是循环输出了 10 次 "线程在运行......"。
package step2; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; // ---------------------Begin------------------------ //tips: 输出语句为:Thread.currentThread().getName()+"的call()方法在运行" //定义一个实现Callable接口的实现类,类名必须命名为MyThread_callable // ---------------------End------------------------ public class CallableExample { public static void main(String[] args) throws InterruptedException, ExecutionException { // 创建Callable接口的实现类对象 MyThread_callable myThread3 = new MyThread_callable(); // 使用FutureTask封装Callable接口 FutureTask<Object> ft1 = new FutureTask<>(myThread3); // 使用Thread(Runnable target ,String name)构造方法创建线程对象 Thread thread1 = new Thread(ft1, "thread1"); // 创建并启动另一个线程thread2 FutureTask<Object> ft2 = new FutureTask<>(myThread3); Thread thread2 = new Thread(ft2, "thread2"); // ---------------------Begin------------------------ // 调用线程对象的start()方法启动线程 // 可以通过FutureTask对象的方法管理返回值 // ---------------------End------------------------ } }
这段代码是一个Java程序,其中定义了一个实现了Callable接口的类MyThread_callable,并创建了两个FutureTask对象ft1和ft2,分别使用MyThread_callable作为构造函数参数。然后,分别创建了两个线程对象thread1和thread2,并将ft1和ft2作为构造函数参数传递给它们。最后,程序需要调用线程对象的start()方法来启动线程,并使用FutureTask对象的方法来管理线程返回值。
需要注意的是,输出语句为“Thread.currentThread().getName()+”的call()方法在运行”,表示线程正在执行call()方法。同时,在代码中的Begin和End之间,需要补充相应的代码来完成程序的功能。
阅读全文