多线程:奇偶数分组打印

一.基于wait,motify
package day26.homework;
import java.io.ObjectInputStream.GetField;
import java.lang.reflect.WildcardType;
import java.util.Random;
import day21.homework.News;

public class work3 {
// 在子线程中输出1-100之间的偶数,主线程输出1-100之间的奇数。
public static void main(String[] args) {
/*
* 创建和启动2个子线程,一个打印1-10之间奇数,一个打印1-10之间偶数, (1)要求每个线程要么不打印,要么就连续打印5个数,每个数打印间隔500毫秒
* (2)但两个线程不要求交替打印。
*/
// 创建所对象
Object object = new Object();
// 用同一把锁
work3Runable runable3 = new work3Runable(object);
work4Runable runable4 = new work4Runable(object);
Thread thread3 = new Thread(runable3, "偶数线程");
Thread thread4 = new Thread(runable4, "奇数线程");
// 开启各自线程
thread3.start();
thread4.start();
}

}

//输出偶数的线程
class work3Runable implements Runnable {
// 维持的锁对象
private Object obj;
// 是否已经遍历结束
private static boolean isend;

public static boolean isIsend() {
    return isend;
}

public work3Runable(Object obj) {
    this.obj = obj;
}

@Override
public void run() {
    // 获取同一个锁对象
    synchronized (obj) {
        // 获取线程名字
        String name = Thread.currentThread().getName();
        // 计数
        int count = 1;
        for (int i = 1; i < 100; i++) {
            // 偶数线程被唤醒
            if (!work4Runable.isIsend())
                obj.notify();

            if (i == 99) {
                // 偶数已经完结
                isend = true;
            }

            if (i % 2 == 0) {
                // 输出偶数
                System.out.println(name + ",第" + count++ + "个" + i);
                if (count == 6) {
                    // 到达5个,重置计数
                    count = 1;
                    // 分割线
                    System.out.println("=========================");

                    try {
                        // 休眠500毫秒
                        Thread.sleep(500);
                        // 如果奇数线程遍历数据还未结束,则线程等待,否则就不执行,只输出自己的
                        if (!work4Runable.isIsend() && !isend)
                            obj.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    System.out.println("~~~~~~~~~~~~~~偶数线程结束~~~~~~~~~~~~~~");
}

}

class work4Runable implements Runnable {
// 锁对象
private Object obj;
// 是否遍历结束
private static boolean isend;

public static boolean isIsend() {
    return isend;
}

public work4Runable(Object obj) {
    this.obj = obj;
}

@Override
public void run() {
    // 获取同一个锁对象
    synchronized (obj) {

        String name = Thread.currentThread().getName();
        // 计数
        int count = 1;

        for (int i = 1; i < 100; i++) {
            // 线程在这里被唤醒了
            obj.notify();
            // 奇数是随机的,要么不打印,要么打印
            Random rd = new Random();
            boolean flag = rd.nextBoolean();

            if (i == 99) {
                // 奇数已经完结
                isend = true;
            }

            if (i % 2 != 0) {
                System.out.println(name + ",第" + count++ + "个" + i);
                if (count == 6) {
                    count = 1;
                    System.out.println("=========================");
                    try {
                        Thread.sleep(500);
                        // 交替打印就去掉flag随机条件
                        if (flag && !work3Runable.isIsend() && !isend)
                            obj.wait();

                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    System.out.println("~~~~~~~~~~~~~~奇数线程结束~~~~~~~~~~~~~~");
}

}

二。基于状态判断循环中断
package day26.homework;

import java.io.ObjectInputStream.GetField;
import java.lang.reflect.WildcardType;
import java.util.Random;

import day21.homework.News;

public class work2 {
// 在子线程中输出1-100之间的偶数,主线程输出1-100之间的奇数。
public static void main(String[] args) {
/*
* 创建和启动2个子线程,一个打印1-10之间奇数,一个打印1-10之间偶数, (1)要求每个线程要么不打印,要么就连续打印5个数,每个数打印间隔500毫秒
* (2)但两个线程不要求交替打印。
*/
Object object = new Object();
work5Runable runable3 = new work5Runable();
work6Runable runable4 = new work6Runable();
Thread thread3 = new Thread(runable3, "偶数线程");
Thread thread4 = new Thread(runable4, "奇数线程");
thread3.start();
thread4.start();
}

}

class work5Runable implements Runnable {
private static volatile int index = 0;
private static boolean isend = false;
private static boolean isbreak = false;

public static boolean isIsbreak() {
    return isbreak;
}

public static void setIsbreak(boolean isbreak) {
    work5Runable.isbreak = isbreak;
}

public static boolean isIsend() {
    return isend;
}

@Override
public void run() {
    String name = Thread.currentThread().getName();
    while (!isend) {
        synchronized ("fz") {
            // 如果是中断状态,什么都不做,等待
            if (!isbreak) {
                int count = 1;
                for (int i = index; i < 100; i++) {
                    index++;
                    if (i % 2 == 0) {
                        System.out.println(name + ",第" + count++ + "个" + i);
                        if (count == 6) {
                            count = 1;
                            System.out.println("=========================");
                            try {
                                Thread.sleep(500);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            setIsbreak(new Random().nextBoolean());
                            if (isbreak && !work6Runable.isIsend()) {
                                break;
                            }
                        }
                    }
                }
                // 如果是临时中断出来,不认为是结束
                if (index >= 100) {
                    isbreak = true;
                    isend = true;
                }
                    
            }
        }
    }
    System.out.println("偶数线程结束");
}

}

class work6Runable implements Runnable {
private static boolean isend = false;
private static volatile int index = 0;
private static boolean isbreak = false;

public static boolean isIsend() {
    return isend;
}

@Override
public void run() {
    while (!isend) {
        synchronized ("fz") {
            // 如果偶数是中断状态
            if (work5Runable.isIsbreak()) {
                String name = Thread.currentThread().getName();
                int count = 1;

                for (int i = index; i < 100; i++) {
                    index++;
                    if (i % 2 != 0) {
                        System.out.println(name + ",第" + count++ + "个" + i);
                        if (count == 6) {
                            count = 1;
                            System.out.println("=========================");
                            try {
                                Thread.sleep(500);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            
                            
                            if(!work5Runable.isIsend()) {
                                work5Runable.setIsbreak(false);
                                break;
                            }
                            
                        }
                    }
                }
                if (index >= 100) {
                    isbreak = true;
                    isend = true;
                }
                    
            }
        }

    }
    System.out.println("奇数线程结束");

}

}

三。基于yield()
class Even implements Runnable {

@Override
public void run() {
    // TODO Auto-generated method stub
    synchronized ("1") {
        int j = 1;
        for (int i = 0; i < 10; i++) {
            Thread.yield();
            
                
                for (int count = 0; count < 5; count++) {
                    
                    System.out.println(Thread.currentThread().getName() + j);
                    j += 2;
                    }
                
                System.out.println("-----------");      
        }
    }   
}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容

  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 2,960评论 1 18
  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 2,458评论 1 15
  • 一扩展javalangThread类二实现javalangRunnable接口三Thread和Runnable的区...
    和帅_db6a阅读 489评论 0 1
  • Object类位于java.lang包中,java.lang包有最基础的和核心的类,在编译时会自动导入; Obje...
    遇见你的故事阅读 587评论 0 0
  • 设置与获取线程名称 package test; /** * 设置与获取线程名称 * @author gaofuzh...
    自由主义者阅读 264评论 0 0