两个线程交替打印0-100
大佬们,我有个问题,可以帮忙解决下吗。🥹🥹
问题:两个线程交替打印0-100,当我使用了for循环,为什么会重复打印?
结果是
线程一打印0
线程二打印0
线程一打印1
线程二打印1
…
线程一打印100
线程二打印100
当我把变量i改为static修饰为共享数据时,问题就解决了。但是我不是只new了一次pk对象,也就是说我不加static不也是两个线程共享变量i吗?那不应该不会重复打印吗?
代码如下 谢谢大佬们
class p2 { public static void main(String[] args) { pk p=new pk(); Thread t1=new Thread(p); Thread t2=new Thread(p); t1.setName("线程一"); t2.setName("线程二"); t1.start(); t2.start(); }}class pk implements Runnable{ public void run() { synchronized (this) { for(int i=0;i<=100;i++) { System.out.println(Thread.currentThread().getName()+"在打印数字"+i); notify(); try { wait(); } catch (Exception e) { throw new RuntimeException(); } } } }} #Java# #多线程#
问题:两个线程交替打印0-100,当我使用了for循环,为什么会重复打印?
结果是
线程一打印0
线程二打印0
线程一打印1
线程二打印1
…
线程一打印100
线程二打印100
当我把变量i改为static修饰为共享数据时,问题就解决了。但是我不是只new了一次pk对象,也就是说我不加static不也是两个线程共享变量i吗?那不应该不会重复打印吗?
代码如下 谢谢大佬们
class p2 { public static void main(String[] args) { pk p=new pk(); Thread t1=new Thread(p); Thread t2=new Thread(p); t1.setName("线程一"); t2.setName("线程二"); t1.start(); t2.start(); }}class pk implements Runnable{ public void run() { synchronized (this) { for(int i=0;i<=100;i++) { System.out.println(Thread.currentThread().getName()+"在打印数字"+i); notify(); try { wait(); } catch (Exception e) { throw new RuntimeException(); } } } }} #Java# #多线程#
全部评论
你这里for循环里面int i = 0 变成线程局部变量,所以会循环打印但是没有共享到i
你把i放到pk类
里面,for写成for(;i<100;i++)
感觉可能因为i是局部变量,每个线程私有所以会重复打印。然后加了static后所有线程共享所以不重复了。
肯定涉及到了线程之间的同步问题啊
好有道理
方法内局部变量线程私有
这种交替的直接用semphere,很方便
相关推荐
11-08 22:47
广东工业大学 Java 点赞 评论 收藏
分享
京东 算法 39.2x19 硕士985
点赞 评论 收藏
分享