老师,这不能同步吗?

老师,这不能同步吗?

package com.practice1;

/**
* @author 谭昌
* @date 2021/4/18
*/
class MyThread extends  Thread{
@Override
   public synchronized void run() {
for (int i = 1; i <10; i++) {
System.out.println(getName()+"正在执行"+i+"次!");

       }
}
}
public class JoinDemo {
public synchronized static void main(String[] args) {
Thread t = new MyThread();
       t.start();
       /*try {
           t.join();
       } catch (InterruptedException e) {
           e.printStackTrace();
       }*/

       for (int i = 1; i < 10; i++) {
System.out.println("主线程运行第"+ i + "次!");
       }
System.out.println("主线程结束!");
   }
}


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
好帮手慕阿满 2021-04-20 11:03:11

同学你好,在同学的代码中,是创建了两个MyThread类对象,这两个对象分别持有MyThread类的锁,互不影响,所以线程不能同步。

http://img1.sycdn.imooc.com//climg/607e42f009015f0903890114.jpg

如果同学想要两个线程同步,应该创建一个MyThread类对象,然后根据这个对象创建两个线程,这样就可以同步,如:

public class Test {

    public static void main(String[] args) {
//        Thread t = new MyThread("tc1");
//        t.start();
//        t = new MyThread("tc2");
//        t.start();
        Thread t = new MyThread();
        Thread t1 = new Thread(t,"tc1");
        Thread t2 = new Thread(t,"tc2");
        t1.start();
        t2.start();

    }
}

class MyThread extends Thread {
//    private String name;
//
//    public MyThread(String name) {
//        this.name = name;
//    }

    @Override
    public synchronized void run() {
        for (int i = 1; i < 50; i++) {
            System.out.println(Thread.currentThread().getName() + "正在执行" + i + "次!");
        }
    }
}

祝学习愉快~

好帮手慕阿满 2021-04-19 10:00:56

同学你好,同学说的同步是指先运行完主线程,再运行Thread线程,或者先运行There线程,再运行主线程吗?这里是不能体现的。

使用synchronized修饰方法的同步是指当一个线程调用这个方法时,其他线程不能调用该方法。如果同学想看到同步的效果,应该定义一个MyThread对象,然后创建多个线程,查看多个线程是否会同步,例如:

http://img1.sycdn.imooc.com//climg/607e424e097d626a03960138.jpg

祝学习愉快~

  • 提问者 慕楠枫桥 #1

    老师,也同步不了

    2021-04-19 22:08:20
  • 提问者 慕楠枫桥 #2
    package com.dljd;

    /**
    * @author 谭昌
    * @date 2021/4/19
    */
    public class JoinDemo {
    public synchronized static void main(String[] args) {
    Thread t = new MyThread("tc1");
           t.start();
           t = new MyThread("tc2");
           t.start();

       }
    }
    class MyThread extends Thread{
    private String name;

       public MyThread(String name) {
    this.name = name;
       }

    @Override
       public synchronized void run() {
    for (int i = 1; i < 10; i++) {
    System.out.println(name+"正在执行"+i+"次!");
           }
    }
    }


    2021-04-19 22:12:54
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师