控制-关于java的一个多线程问题,为什么输出的不是一次tom一次李四,是不是在输入判断0,1那里有问题?

问题描述

关于java的一个多线程问题,为什么输出的不是一次tom一次李四,是不是在输入判断0,1那里有问题?

class Producer//这个是单生产线,单消费问题,一个单生产线有多条路径的问题(最后的效果的输入输出线程轮流执行)
{
public static void main(String[] args)
{
//创建资源
Resource res=new Resource();
//创建线程
input in=new input(res);
output out=new output(res);
//创建线程执行路径
Thread a=new Thread(in);//这里只能有单路径,如果用了多路径就会发生不能一进一出。
Thread b=new Thread(out);
Thread c=new Thread(in);
Thread d=new Thread(out);
//启动线程
a.start();
b.start();
c.start();
d.start();
}
}
class Resource//资源//2.这里要进行代码优化
{
private String name;
private String sex;
private boolean flag=false;
public synchronized void setR(String name/*,String sex*/)//同步函数
{
while(flag)//这里把if换成while是为了让被唤醒的线程能再次进行判断flag,阻止输出还没有执行的同时输入进行了多次执行。但是这样就会出现死锁的情况。
try{this.wait();}catch(InterruptedException e){}
this.name=name;
System.out.println(Thread.currentThread().getName()+name+"..."/*sex*/);
//this.sex=sex;
flag=true;
//notify();//因为这个方法时任意唤醒一个线程,当唤醒笨线程的时候就会出现死锁。
notifyAll();//等待的线程全部被唤醒
}
public synchronized void getR()
{
while(!flag)
try{this.wait();}catch(InterruptedException e){}
System.out.println(Thread.currentThread().getName()+name+"..."/*sex*/);
flag=false;
//notify();
notifyAll();
}
}
class input implements Runnable//输入
{
int i=1;
Resource r;
boolean flag;

input(Resource r)
{
this.r=r;
}

public void run()
{
while(true)
{
if(i==0)
r.setR("tom");
else
r.setR("李四");
i=(i+1)%2;
/*synchronized (r)
{
if(r.flag)//这条控制语句就是为了实现控制是否等待是否输入
try{r.wait();}catch(InterruptedException e){}//这里的wait方法的意思是:如果输入执行完了就等待输出执行完了被唤醒再进行输入,否则再次输入会覆盖之前的值
show();
r.flag=true;
r.notify();
i=(i+1)%2;
}*/
}
}
//void show()
//{
/*if(i==0)
{
r.name="tom";
r.sex="man";
}
if(i==1)
{
r.name="李四";
r.sex="男";
}*/
//}

}
class output implements Runnable//输出
{
Resource r;
boolean flag;
output(Resource r)
{
this.r=r;
}
public void run()
{
while(true)
{
r.getR();
/*synchronized (r){
if(!r.flag)//这条控制语句就是为了实现控制是否等待是否输入
try{r.wait();}catch(InterruptedException e){}
System.out.println(r.name+"..."+r.sex);
r.flag=false;
r.notify();}*/
}
}
}

解决方案

  Thread a=new Thread(in);//这里只能有单路径,如果用了多路径就会发生不能一进一出。
Thread b=new Thread(out);
Thread c=new Thread(in);
Thread d=new Thread(out);

这里有2个生产者和2个消费者,2个生产者之间是没有约束的,两个消费者之间也是没有约束的。因此2个生产者set进去的名字就不一定是交替的。可能连续2次是一样的。消费者也一样,2个消费者打印的可能是同一个名字。

这个例子一个生成者一个消费者就没问题。去掉c和d两个线程

解决方案二:

你的代码确实是一进一出啊,输出都是很规律的,感觉你这个没有实现多线程啊,程序控制的太多了,你共用了r对象,然后在设置变量时为了避免死锁用了wait和notifyAll方法,其实已经将多线程设置成单线程了。

解决方案三:

多线程不做同步处理,什么输出顺序都有可能

时间: 2024-11-02 06:52:46

控制-关于java的一个多线程问题,为什么输出的不是一次tom一次李四,是不是在输入判断0,1那里有问题?的相关文章

如何用java实现一个类的主题输出

问题描述 请问大侠们,以下的问题要如何去解决:我有一个类Event如下publicclassEvent{publicEvent(Stringsubject,DatestartDate){.....}.....}要求Event要提前15分钟输出subject给用户.目前我的做法如下:publicclassEventimplementsRunnable{publicEvent(Stringsubject,CalendarstartDate){setSubject(subject);setStartD

并行计算-来探索一个多线程的问题,求解答

问题描述 来探索一个多线程的问题,求解答 1.突然间看到一个关于java的信号量的知识:Semaphore:2.自己就想一个场景,就是让3个会计统计,她们分别获得sum1,sum2,sum3当她们都计算完了,我们就统一相加得到总数: 请问如何如何用java写一个2的模拟代码?能用上Semaphore吗? 解决方案 你的问题:http://my.oschina.net/tinglanrmb32/blog/339661 信号量可以控制线程并发个数http://blog.csdn.net/shihua

问各位大神一个多线程的问题

问题描述 问各位大神一个多线程的问题 import java.util.Date; public class TimePrinter extends Thread{ String mizi; public TimePrinter(String name){ mizi=name; } public void run() { try { for (int i = 0; i < 32767; i++) { System.out.println(mizi+i); sleep(1); } } catch

基于Java回顾之多线程同步的使用详解_java

首先阐述什么是同步,不同步有什么问题,然后讨论可以采取哪些措施控制同步,接下来我们会仿照回顾网络通信时那样,构建一个服务器端的"线程池",JDK为我们提供了一个很大的concurrent工具包,最后我们会对里面的内容进行探索. 为什么要线程同步? 说到线程同步,大部分情况下, 我们是在针对"单对象多线程"的情况进行讨论,一般会将其分成两部分,一部分是关于"共享变量",一部分关于"执行步骤". 共享变量 当我们在线程对象(Run

基于Java回顾之多线程详解_java

线程是操作系统运行的基本单位,它被封装在进程中,一个进程可以包含多个线程.即使我们不手动创造线程,进程也会有一个默认的线程在运行. 对于JVM来说,当我们编写一个单线程的程序去运行时,JVM中也是有至少两个线程在运行,一个是我们创建的程序,一个是垃圾回收. 线程基本信息 我们可以通过Thread.currentThread()方法获取当前线程的一些信息,并对其进行修改. 我们来看以下代码: 复制代码 代码如下: 查看并修改当前线程的属性 String name = Thread.currentT

Java进阶05 多线程

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!    多线程 多线程(multiple thread)是计算机实现多任务并行处理的一种方式. 在单线程情况下,计算机中存在一个控制权,并按照顺序依次执行指令.单线程好像是一个只有一个队长指挥的小队,整个小队同一个时间只能执行一个任务. 单线程   在多线程情境下,计算机中有多个控制权.多个控制权可以同时进行,每个控制权依次执行一系列的指令.多线程好像是一个小队中的成员同时执行不同

为什么用 Java:一个 Python 程序员告诉你

每当我告诉别人我一直在用Java工作时,大家的反应都是: "纳尼!Java?为啥是Java?" 说实话,本人刚开始的时候也是同样的反应.但是由于Java的类型安全,执行性能和坚如磐石的工具,我渐渐地开始欣赏Java.同时我注意到,现在的Java已今非昔比--它在过去的10年间稳健地改善着. 缘何是Java? 假 设每天都用Java的想法还没有让君恶心到食不下咽,我在此重申Java已非你所了解的"吴下阿蒙"了.当Python, Ruby, 和Javascript在&q

java代码-用java做一个满天星星

问题描述 用java做一个满天星星 这做完之后,怎么使星星?不断循环下落或者这么使它眨眼,我是一个初学者,想请求有大神赐教 解决方案 效果图是什么样子的,有个效果图好做些 解决方案二: 主线程控制星星的下落,再开一个线程控制眨眼, 解决方案三: Animation这个应该可以的...................

浅谈java中异步多线程超时导致的服务异常_java

在项目中为了提高大并发量时的性能稳定性,经常会使用到线程池来做多线程异步操作,多线程有2种,一种是实现runnable接口,这种没有返回值,一种是实现Callable接口,这种有返回值. 当其中一个线程超时的时候,理论上应该不 影响其他线程的执行结果,但是在项目中出现的问题表明一个线程阻塞,其他线程返回的接口都为空.其实是个很简单的问题,但是由于第一次碰到,还是想了一些时间的.很简单,就是因为阻塞的那个线 程没有释放,并发量一大,线程池数量就满了,所以其他线程都处于等待状态. 附上一段自己写的调