VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
12
返回列表 发新帖
楼主: kippakiss

很有意思的一个题目:关于多线程!!

[复制链接]

2

主题

6

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
 楼主| 发表于 2020-1-17 14:45:02 | 显示全部楼层
可以根据我的源码改一下么 ?

非常感激!!

这个问题困绕我都好几天了
回复

使用道具 举报

0

主题

5

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-1-18 11:27:01 | 显示全部楼层
因为盘子会有共享互斥,
所以你应该把关注的焦点放在它的身上.
回复

使用道具 举报

2

主题

6

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
 楼主| 发表于 2020-1-20 21:09:01 | 显示全部楼层
大家能敲点代码,演示一下

就举只有 两个家庭的例子 f1,m1,s1,d1
                        f2,m2,s2,d2

我现在越来越糊涂了  大家帮个忙
回复

使用道具 举报

0

主题

4

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-1-21 16:45:54 | 显示全部楼层
add some code into your "get(),set()"
satatic Vector vector=new Vector(10);  //class  variable
such as:  

synchronized(vector.size()...) {
.....//  do something with your
}
回复

使用道具 举报

0

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-1-21 20:18:01 | 显示全部楼层
q.putOrange(q.orange);
不能保证q.orange的同步吧?

public synchronized void putOrange(int i)改成下面的样子可以吗?
public synchronized int putOrange()

返回值是q.orange。
回复

使用道具 举报

0

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-1-30 05:36:01 | 显示全部楼层
package test;

public class ThreadTest {

        public static void main(String[] args) {
                Plate q = new Plate();
                Father f1 = new Father(q);
                Father f2 = new Father(q);
                Father f3 = new Father(q);
                Father f4 = new Father(q);

                Mother m1 = new Mother(q);
                Mother m2 = new Mother(q);
                Mother m3 = new Mother(q);
                Mother m4 = new Mother(q);

                Son s1 = new Son(q);
                Son s2 = new Son(q);
                Son s3 = new Son(q);
                Son s4 = new Son(q);

                Daughter d1 = new Daughter(q);
                Daughter d2 = new Daughter(q);
                Daughter d3 = new Daughter(q);
                Daughter d4 = new Daughter(q);

                f1.start();
                f2.start();
                f3.start();
                f4.start();

                m1.start();
                m2.start();
                m3.start();
                m4.start();

                s1.start();
                s2.start();
                s3.start();
                s4.start();

                d1.start();
                d2.start();
                d3.start();
                d4.start();
        }
}

class Father extends Thread {
        Plate q;

        Father(Plate q) {
                this.q = q;
        }

        public void run() {
                while (true) {
                        int apple = q.putApple();
                        System.out.println(Thread.currentThread().getName()
                                        + " put one apple: the number of apple in the plate:"
                                        + apple);
                }
        }
}

class Mother extends Thread {
        Plate q;

        Mother(Plate q) {
                this.q = q;
        }

        public void run() {
                while (true) {
                        int orange= q.putOrange();
                        System.out.println(Thread.currentThread().getName()
                                        + " put one orange:the number of orange in the plate:"
                                        + orange);
                }
        }
}

class Son extends Thread {
        Plate q;

        Son(Plate q) {
                this.q = q;
        }

        public void run() {
                while (true) {
                        System.out.println(Thread.currentThread().getName()
                                        + " get one orange:the number of orange in the plate:"
                                        + q.getOrange());
                }
        }
}

class Daughter extends Thread {
        Plate q;

        Daughter(Plate q) {
                this.q = q;
        }

        public void run() {
                while (true) {
                        System.out
                                        .println(Thread.currentThread().getName()
                                                        + "Daughter get one apple:the number of apple in the plate:"
                                                        + q.getApple());
                }
        }
}

class Plate {

        private int apple = 0;
        private int orange = 0;
        private int pFull = 10;

        public synchronized int putApple() {

                while(!Thread.currentThread().isInterrupted()){
                        if( pFull > 0){
                                apple++;
                                pFull--;
                                break;
                        }else{
                                try {
                                        wait();
                                } catch (Exception e) {
                                        e.printStackTrace();
                                }                       
                        }
                }
                notifyAll();
                return apple;
        }

        public synchronized int getApple() {
                while (apple <= 0 ) {
                        try {
                                wait();
                        } catch (Exception e) {
                                e.printStackTrace();
                        }
                }
                pFull++;
                apple--;
                notifyAll();
                return apple+1;
        }

        public synchronized int putOrange() {
                while(!Thread.currentThread().isInterrupted()){
                        if( pFull > 0){
                                orange++;
                                pFull--;
                                break;
                        }else{
                                try {
                                        wait();
                                } catch (Exception e) {
                                        e.printStackTrace();
                                }                       
                        }
                }
                notifyAll();
                return orange;
        }

        public synchronized int getOrange() {
                while (orange <= 0 ) {
                        try {
                                wait();
                        } catch (Exception e) {
                                e.printStackTrace();
                        }
                }
                pFull++;
                orange--;
                notifyAll();
                return orange+1;
        }
}
回复

使用道具 举报

0

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-5-6 19:30:01 | 显示全部楼层
哪有这样控制同步的?
开始没东西时2种(8个)get线程都被block,2种(8个)put线程竞争。假设其中一个putApple得胜,将放入1苹果并唤醒其他线程,继续竞争,若此时某个getOrange获胜,注意到将从wait代码块后面执行,于是程序将拿取一个桔子。。。明显的逻辑错误。

办法:
在plate定义两个list(数组或者Integer也可),一个放桔子一个放苹果,用这两个东西来分别控制两对get/put方法。
回复

使用道具 举报

0

主题

11

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-5-24 00:30:01 | 显示全部楼层
操作系统 课上的例子……
回复

使用道具 举报

0

主题

1

帖子

0.00

积分

新手上路

Rank: 1

积分
0.00
发表于 2020-5-24 17:20:38 | 显示全部楼层
upxia jiuxianghunge jifen
回复

使用道具 举报

1

主题

6

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-6-21 20:00:01 | 显示全部楼层
试试看,不一定符合你的要求!
public class ThreadTest
{
        public static void main(String[] args)
        {
                Fruits q = new Fruits();
               
                Father f1=new Father(q);
                Father f2=new Father(q);
                Father f3=new Father(q);
                Father f4=new Father(q);
               
                Mother m1=new Mother(q);
                Mother m2=new Mother(q);
                Mother m3=new Mother(q);
                Mother m4=new Mother(q);
               
                Son s1=new Son(q);
                Son s2=new Son(q);
                Son s3=new Son(q);
                Son s4=new Son(q);
               
                Daughter d1=new Daughter(q);
                Daughter d2=new Daughter(q);
                Daughter d3=new Daughter(q);
                Daughter d4=new Daughter(q);
               
                f1.start();
                f2.start();
                f3.start();
                f4.start();
               
                m1.start();
                m2.start();
                m3.start();
                m4.start();
               
                s1.start();
                s2.start();
                s3.start();
                s4.start();
               
                d1.start();
                d2.start();
                d3.start();
                d4.start();
        }
}

class Father extends Thread
{
        Fruits fruit;
        Father(Fruits fruit)
        {
                this.fruit = fruit;
        }
       
        public void run()
        {
                while(true)
                {
                        fruit.setApple();
                        System.out.println(Thread.currentThread().getName() +
                                " put one apple: the number of apple in the plate:" + fruit.appleNumber +
                                "the number of full in the plate:" + fruit.full);
                }
        }
}

class Mother extends Thread
{
        Fruits fruit;
        Mother(Fruits fruit)
        {
                this.fruit = fruit;
        }
       
        public void run()
        {
                while(true)
                {
                        fruit.setOrange();
                        System.out.println(Thread.currentThread().getName() +
                                " put one oranger: the number of orange in the plate:" + fruit.orangeNumber +
                                "the number of full in the plate:" + fruit.full);
                }
        }
}

class Son extends Thread
{
        Fruits fruit;
        Son(Fruits fruit)
        {
                this.fruit = fruit;
        }
       
        public void run()
        {
                while(true)
                {
                        fruit.getOrange();
                        System.out.println(Thread.currentThread().getName() +
                                " get one orange: the number of orange in the plate:" + fruit.orangeNumber +
                                "the number of full in the plate:" + fruit.full);
                }
        }
}

class Daughter extends Thread
{
        Fruits fruit;
        Daughter(Fruits fruit)
        {
                this.fruit = fruit;
        }
       
        public void run()
        {
                while(true)
                {
                        fruit.getApple();
                        System.out.println(Thread.currentThread().getName() +
                                " get one apple: the number of apple in the plate:" + fruit.appleNumber +
                                "the number of full in the plate:" + fruit.full);
                }
        }
}

class Fruits
{
        int appleNumber = 0;
        int orangeNumber = 0;
        int full = 0;
       
        public synchronized int setApple()
        {
                if(full < 10 && full >= 0 && appleNumber < 10)
                {
                        appleNumber += 1;
                        full++;
                }
                return appleNumber;
        }
       
        public synchronized int getApple()
        {
                if(full >= 1 && full <=10 && appleNumber >= 1)
                {
                        appleNumber -= 1;
                        full--;
                }
                return appleNumber;
        }
       
        public synchronized int setOrange()
        {
                if(full < 10 && full >= 0 && orangeNumber < 10)
                {
                        orangeNumber += 1;
                        full++;
                }
                return orangeNumber;
        }
       
        public synchronized int getOrange()
        {
                if(full >= 1 && full <=10 && orangeNumber >= 1)
                {
                        orangeNumber -= 1;
                        full--;
                }
                return orangeNumber;
        }
       
        public synchronized int getFull()
        {
                return appleNumber + orangeNumber;
        }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表