多线程的问题

doramii 2016-11-02 10:25:42
一个线程的连续两个语句都是在命令行输出内容,怎么能保证这个线程在执行完前一句之后,cpu不会突然切换到其他线程执行,导致这两个输出之间出现其他线程的输出?
也就是希望这两个输出在命令行上总是连续出现的。
...全文
528 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 13 楼 doramii 的回复:
[quote=引用 2 楼 Sun1956 的回复:] 可以尝试下ReentrantLock
可能是我说的不清楚,被当成了多深奥的问题,完全看不懂ReentrantLock是什么意思 其实就是生产者消费者问题的例子程序,在生产者线程里有两句分别是调用篮子的put方法(往篮子里放入馒头i)和在命令行输出“生产了馒头i”,如果这两句之间被消费者线程打断(消费者线程会用take方法从篮子里拿走馒头i然后输出“吃掉了馒头i”),命令行上就会先看到“吃掉了馒头i”后看到“生产了馒头i”。所以不想生产者线程里的那两句被打断的话,该怎么写?[/quote] 你这个问题挺有意思的,我想了一会感觉还是用CountDownLatch比较好,虽然你说不要阻塞效果,可是生产者和消费者模式本来就会有阻塞呀。
ps45221 2016-11-04
  • 打赏
  • 举报
回复
引用 13 楼 doramii 的回复:
[quote=引用 2 楼 Sun1956 的回复:] 可以尝试下ReentrantLock
可能是我说的不清楚,被当成了多深奥的问题,完全看不懂ReentrantLock是什么意思 其实就是生产者消费者问题的例子程序,在生产者线程里有两句分别是调用篮子的put方法(往篮子里放入馒头i)和在命令行输出“生产了馒头i”,如果这两句之间被消费者线程打断(消费者线程会用take方法从篮子里拿走馒头i然后输出“吃掉了馒头i”),命令行上就会先看到“吃掉了馒头i”后看到“生产了馒头i”。所以不想生产者线程里的那两句被打断的话,该怎么写?[/quote] 2种方法, 第一种加上同步,synchronized,整个方法,还是一段代码,自己定 第二种就是把这两句代码用reentrantlock包围,效率比synchronized高 另外CountDownLatch是等待到达一定的数量,再一起执行,不符合需求。
苍茫行者 2016-11-04
  • 打赏
  • 举报
回复
楼主的问题,相当于将System输出当做竞争资源,那你就要加个全局锁,这样就算线程切换了,也要等待,类似上面说的ReentrantLock,当前可以直接采用synchronized语句块,简单点的说就是采用工作者和消费者模式
ps45221 2016-11-04
  • 打赏
  • 举报
回复
引用 17 楼 doramii 的回复:
[quote=引用 15 楼 Sun1956 的回复:] [quote=引用 13 楼 doramii 的回复:] [quote=引用 2 楼 Sun1956 的回复:] 可以尝试下ReentrantLock
可能是我说的不清楚,被当成了多深奥的问题,完全看不懂ReentrantLock是什么意思 其实就是生产者消费者问题的例子程序,在生产者线程里有两句分别是调用篮子的put方法(往篮子里放入馒头i)和在命令行输出“生产了馒头i”,如果这两句之间被消费者线程打断(消费者线程会用take方法从篮子里拿走馒头i然后输出“吃掉了馒头i”),命令行上就会先看到“吃掉了馒头i”后看到“生产了馒头i”。所以不想生产者线程里的那两句被打断的话,该怎么写?[/quote] 2种方法, 第一种加上同步,synchronized,整个方法,还是一段代码,自己定 第二种就是把这两句代码用reentrantlock包围,效率比synchronized高 另外CountDownLatch是等待到达一定的数量,再一起执行,不符合需求。[/quote] 生产者和消费者是两个线程类,如果我在生产者线程类里面用了synchronized(this){这两句话},只能让其他生产者线程不会进来打断,一个消费者线程还是能进来的吧[/quote] 生产者/消费者可以参考BlockingQueue实现
doramii 2016-11-04
  • 打赏
  • 举报
回复
引用 15 楼 Sun1956 的回复:
[quote=引用 13 楼 doramii 的回复:] [quote=引用 2 楼 Sun1956 的回复:] 可以尝试下ReentrantLock
可能是我说的不清楚,被当成了多深奥的问题,完全看不懂ReentrantLock是什么意思 其实就是生产者消费者问题的例子程序,在生产者线程里有两句分别是调用篮子的put方法(往篮子里放入馒头i)和在命令行输出“生产了馒头i”,如果这两句之间被消费者线程打断(消费者线程会用take方法从篮子里拿走馒头i然后输出“吃掉了馒头i”),命令行上就会先看到“吃掉了馒头i”后看到“生产了馒头i”。所以不想生产者线程里的那两句被打断的话,该怎么写?[/quote] 2种方法, 第一种加上同步,synchronized,整个方法,还是一段代码,自己定 第二种就是把这两句代码用reentrantlock包围,效率比synchronized高 另外CountDownLatch是等待到达一定的数量,再一起执行,不符合需求。[/quote] 生产者和消费者是两个线程类,如果我在生产者线程类里面用了synchronized(this){这两句话},只能让其他生产者线程不会进来打断,一个消费者线程还是能进来的吧
NewMoons 2016-11-03
  • 打赏
  • 举报
回复
上面说的都不是最优雅的解决方案。 java早就考虑你这个需求了,所以Object基类本身就有以下三类方法去解决你的需求: wait(); notify(); notifyAll(); 至于怎么用,请先自行百度。 顺便说句,java新版本ReentrantLock好像有更优雅的解决方案,这个我没研究,感兴趣自己再搜搜吧。
doramii 2016-11-03
  • 打赏
  • 举报
回复
引用 2 楼 Sun1956 的回复:
可以尝试下ReentrantLock
可能是我说的不清楚,被当成了多深奥的问题,完全看不懂ReentrantLock是什么意思 其实就是生产者消费者问题的例子程序,在生产者线程里有两句分别是调用篮子的put方法(往篮子里放入馒头i)和在命令行输出“生产了馒头i”,如果这两句之间被消费者线程打断(消费者线程会用take方法从篮子里拿走馒头i然后输出“吃掉了馒头i”),命令行上就会先看到“吃掉了馒头i”后看到“生产了馒头i”。所以不想生产者线程里的那两句被打断的话,该怎么写?
rickylin86 2016-11-03
  • 打赏
  • 举报
回复
引用 7 楼 zhouren1314 的回复:
[quote=引用 5 楼 rickylin86 的回复:] [quote=引用 3 楼 zhouren1314 的回复:] 要是这样,那就不要开线程了,开进程。线程的目的就是异步 与其他线程或者主线程切换cpu轮换执行。。。
其实现实中存在某些这样的需求的.比如A B C 三个线程,B C线程需要用到A线程的执行结果.那么这个时候自然需要A线程优先执行完毕再去执行B C线程[/quote] 既然需要A的数据,为什么不让让A执行完后在调用方法开启B,C线程,非得同时开启? 能举一个现实的场景么?[/quote] 你所说的解决方案也是一种. 但是对于采用执行器框架来解决多线程的时候,我更喜欢的是将多个线程提交给执行器去处理,而不是在其中的某个线程中再去生成新的线程.
doramii 2016-11-03
  • 打赏
  • 举报
回复
引用 4 楼 rickylin86 的回复:
ReentrantLock仅仅只能用做线程互斥. 可以考虑用CountDownLatch. 其他线程调用CountDownLatch的await方法. 需要优先执行的线程最后添加一句CountDownLatch.countDown 这样的话确保线程优先执行,然后再执行其他的等待线程
也不是希望别的线程要在那里等着,整体上看所有的线程还是要同时进行的,只是希望别的线程不要在这个线程的这两句话之间插进来。 其实就是生产者消费者问题的例子程序,在生产者线程里有两句分别是调用篮子的put方法(往篮子里放入馒头i)和在命令行输出“生产了馒头i”,如果这两句之间被消费者线程打断(消费者线程会用take方法从篮子里拿走馒头i然后输出“吃掉了馒头i”),命令行上就会先看到“吃掉了馒头i”后看到“生产了馒头i”。所以不想生产者线程里的那两句被打断的话,该怎么写?
乔不思 2016-11-03
  • 打赏
  • 举报
回复
引用 5 楼 rickylin86 的回复:
[quote=引用 3 楼 zhouren1314 的回复:] 要是这样,那就不要开线程了,开进程。线程的目的就是异步 与其他线程或者主线程切换cpu轮换执行。。。
其实现实中存在某些这样的需求的.比如A B C 三个线程,B C线程需要用到A线程的执行结果.那么这个时候自然需要A线程优先执行完毕再去执行B C线程[/quote] 恩,你说的对
X元素 2016-11-03
  • 打赏
  • 举报
回复
CountDownLatch 看看这个api
乔不思 2016-11-03
  • 打赏
  • 举报
回复
引用 5 楼 rickylin86 的回复:
[quote=引用 3 楼 zhouren1314 的回复:] 要是这样,那就不要开线程了,开进程。线程的目的就是异步 与其他线程或者主线程切换cpu轮换执行。。。
其实现实中存在某些这样的需求的.比如A B C 三个线程,B C线程需要用到A线程的执行结果.那么这个时候自然需要A线程优先执行完毕再去执行B C线程[/quote] 既然需要A的数据,为什么不让让A执行完后在调用方法开启B,C线程,非得同时开启? 能举一个现实的场景么?
乔不思 2016-11-03
  • 打赏
  • 举报
回复
引用 5 楼 rickylin86 的回复:
[quote=引用 3 楼 zhouren1314 的回复:] 要是这样,那就不要开线程了,开进程。线程的目的就是异步 与其他线程或者主线程切换cpu轮换执行。。。
其实现实中存在某些这样的需求的.比如A B C 三个线程,B C线程需要用到A线程的执行结果.那么这个时候自然需要A线程优先执行完毕再去执行B C线程[/quote] 既然需要A的数据,为什么让A执行往后在调用方法开启B,C线程
rickylin86 2016-11-03
  • 打赏
  • 举报
回复
引用 3 楼 zhouren1314 的回复:
要是这样,那就不要开线程了,开进程。线程的目的就是异步 与其他线程或者主线程切换cpu轮换执行。。。
其实现实中存在某些这样的需求的.比如A B C 三个线程,B C线程需要用到A线程的执行结果.那么这个时候自然需要A线程优先执行完毕再去执行B C线程
rickylin86 2016-11-03
  • 打赏
  • 举报
回复
ReentrantLock仅仅只能用做线程互斥. 可以考虑用CountDownLatch. 其他线程调用CountDownLatch的await方法. 需要优先执行的线程最后添加一句CountDownLatch.countDown 这样的话确保线程优先执行,然后再执行其他的等待线程
乔不思 2016-11-03
  • 打赏
  • 举报
回复
要是这样,那就不要开线程了,开进程。线程的目的就是异步 与其他线程或者主线程切换cpu轮换执行。。。
ps45221 2016-11-03
  • 打赏
  • 举报
回复
可以尝试下ReentrantLock
qq_35189707 2016-11-02
  • 打赏
  • 举报
回复
给第三个线程设置一下sleep()或者wait()可以么

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧