黑马程序员技术交流社区
标题:
多线程问题。
[打印本页]
作者:
于启会
时间:
2012-9-5 15:13
标题:
多线程问题。
本帖最后由 于启会 于 2012-9-5 16:56 编辑
<p>----Resource类:
package com.Demo;</p><p>public class Resource {
private String name;
private String sex;
private boolean flog=false;
public void set(String name,String sex){
synchronized (this) {
if(flog){
try{
this.wait();
}catch (Exception e) {
}
}
this.name=name;
this.sex=sex;
flog=true;
this.notify();
}
}
public void get(){
synchronized (this) {
if(!flog){
try{
this.wait();
}catch (Exception e) {
}
}
System.out.println(name+"......"+sex);
flog=false;
this.notify();
}
}
}
-----Input类:
package com.Demo;</p><p>public class Input implements Runnable{
private Resource r;
public Input(Resource r){
this.r=r;
}
public void run() {
int x=0;
while(true){
if(x==0){
r.set("丽丽", "女");
}else{
r.set("龙龙", "男");
}
x=(x+1)%2;
}
}
}
----Output类:
package com.Demo;</p><p>public class Output implements Runnable{
private Resource r;
public Output(Resource r){
this.r=r;
}
public void run() {
while(true){
r.get();
}
}</p><p>}
---MainDemo类:
package com.Demo;</p><p>public class MainDemo {
public static void main(String[] args) {
new Thread(new Input(new Resource())).start();
new Thread(new Output(new Resource())).start();
}
}
打印结果是null....null闪一下然后不输出,求指导。。</p>
复制代码
作者:
杨卫腾
时间:
2012-9-5 16:32
class Resouce
{
private String name;
private String sex;
private boolean flag = true;
Resouce()
{
}
Resouce(String name,String sex)
{
this.name = name;
this.sex = sex;
}
public synchronized void setRes(String name,String sex)
{
if(!flag)
try
{
wait();
}
catch (InterruptedException ie)
{
ie.printStackTrace();
}
this.name = name;
this.sex = sex;
flag = false;
notify();
}
public synchronized void getRes()
{
if(flag)
try
{
wait();
}
catch (InterruptedException ie)
{
ie.printStackTrace();
}
System.out.println(/*Thread.currentThread().getName()+*/"name:"+name+"..."+"sex:"+sex);
flag = true;
notify();
}
}
class Input implements Runnable
{
private Resouce r;
Input(Resouce r)
{
this.r = r;
}
public void run()
{
int x = 0;
while(true)
{
if(x==0)
r.setRes("丽丽","女");
else
r.setRes("龙龙","男");
x = (x+1)%2;
}
}
}
class Output implements Runnable
{
private Resouce r;
Output(Resouce r)
{
this.r = r;
}
public void run()
{
while(true)
{
r.getRes();
}
}
}
class InputOutputThread2
{
public static void main(String[] args)
{
Resouce r = new Resouce();
new Thread(new Input(r),"存储").start();
new Thread(new Output(r),"读出").start();
}
}
复制代码
看看这个结果行不行
作者:
袁艳超
时间:
2012-9-5 16:37
你定义了两个Resource类的对象,可以这样分析一下,
先分别给两个Resource类的对象命名一下,一个是Resource A ,一个是Resource B;
简称一下线程,一个是线程input,一个是线程output
input线程先启动,给A 设置进去了name和age的值,然后就wait等着output线程来取,
可是,output线程已启动却是等着取出B的值,
它们将一直等下去,因为不会有线程给B设置,也不会有线程去取A的值
所以,把main方法里的代码修改如下:
Resource res = new Resource(); //创建一个Resource对象让两个线程去操作,否则你定义的synchronized同步方法没有意义嘛!
new Thread(new Input(res)).start();
new Thread(new Output(res)).start();
另外,唤醒线程的方法,尽量不要用notify;要用notifyAll,因为线程都是线程调度器来调用的,你是控制不了的,所以用notify有时会出问题
作者:
于启会
时间:
2012-9-5 16:55
袁艳超 发表于 2012-9-5 16:37
你定义了两个Resource类的对象,可以这样分析一下,
先分别给两个Resource类的对象命名一下,一个是Resourc ...
额 创建对象那里写错了。。找了半天就是没找main方法中的代码。。受教了。。:hug:
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2