多线程练习题

多线程练习题

编写程序实现,子线程循环3次,接着主线程循环5次,接着再子线程循环3次,主线程循环5次,如此反复,循环3次

第一种实现方式:使用synchronized关键字

?package com.aaa.test;?public class Test1 {?    private boolean flag=false;?//    主线程要实现的功能    public synchronized void mainFunction(){?        while (!flag){            try {                this.wait();            } catch (InterruptedException e) {                e.printStackTrace();            }        }        for (int i=0;i<5;i++){            System.out.println("mainFunction,主线程循环"+i+"次");        }        this.notify();        flag=false;    }?//    子线程要实现的功能    public synchronized void subFunction(){?        while (flag){            try {                this.wait();            } catch (InterruptedException e) {                e.printStackTrace();            }        }        for (int i=0;i<3;i++){            System.out.println("subFunction,子线程循环"+i+"次");        }        this.notify();        flag=true;    }?    public static void main(String[] args) {       final Test1 t= new Test1();//       子线程循环三次        new Thread(new Runnable() {?            public void run() {                for (int i=0;i<3;i++){                    t.subFunction();                    System.out.println("======");                }            }        }).start();?//        主线程循环三次        for (int i=0;i<3;i++){            t.mainFunction();            System.out.println("======");        }    }}??

第二种实现方式:使用 lock 锁和 Condition 接口

?package com.aaa.test;?import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;?public class Test2 {    private boolean flag = false;    Lock lock = new ReentrantLock();    Condition con = lock.newCondition();?//    主线程要实现的功能    public void mainFunction(){        System.out.println("1.主线程开始"+" -- flag="+flag);        lock.lock();        try{            while(!flag){                try {                    System.out.println("2.主线程等待"+" -- flag="+flag);                    con.await();                    // 使当前线程加入 await() 等待队列中,并释放当锁,当其他线程调用signal()会重新请求锁。与Object.wait()类似。                } catch (InterruptedException e) {                    e.printStackTrace();                }            }            System.out.println("7.主线程开始循环5次"+" -- flag="+flag);            for(int i=0;i<5;i++){                System.out.println("mainFunction"+i+" -- flag="+flag);            }            flag = false;            System.out.println("8.唤醒子线程"+" -- flag="+flag);            con.signal();            // 唤醒一个在 await()等待队列中的线程。与Object.notify()相似        }finally{            lock.unlock();        }    }?    // 子线程要实现的功能    public void subFunction(){        System.out.println("3.子线程开始"+" -- flag="+flag);        lock.lock();        try{            while(flag){                try {                    System.out.println("6.子线程等待"+" -- flag="+flag);                    con.await();  // 使当前线程加入 await() 等待队列中,并释放当锁,当其他线程调用signal()会重新请求锁。与Object.wait()类似。                } catch (InterruptedException e) {                    e.printStackTrace();                }            }            System.out.println("4.子线程开始循环3次"+" -- flag="+flag);            for(int i=0;i<3;i++){                System.out.println("subFunction"+i+" -- flag="+flag);            }            flag = true;            System.out.println("5.唤醒主线程"+" -- flag="+flag);            con.signal(); // 唤醒一个在 await()等待队列中的线程。与Object.notify()相似        }finally{            lock.unlock();        }    }?    public static void main(String[] args) {        final Test2 t= new Test2();//       子线程循环三次        new Thread(new Runnable() {?            public void run() {                for (int i=0;i<3;i++){                    t.subFunction();                    System.out.println("======");                }            }        }).start();?//        主线程循环三次        for (int i=0;i<3;i++){            t.mainFunction();            System.out.println("======");        }    }}

模拟多个人通过一个山洞的模拟,这个山洞每次只能通过一个人,每个人通过山洞的时间为5秒,随机生成10个人,同时准备过此山洞,显示以下每次通过山洞的人的姓名。

package com.aaa.test;?import java.util.LinkedHashSet;import java.util.Set;?public class Test3 implements Runnable{    private static int deng=0;    @Override    public void run() {        deng= deng+50;?        try        {            Thread.sleep(deng);?        } catch (InterruptedException e)        {?            e.printStackTrace();        }?        System.out.println(Thread.currentThread().getName()                +" 过山洞");    }?    public static void main(String[] args) {        String ary[] ={"赵","钱","孙","李","周","吴","郑","王","冯","陈"};?        Test3 gsd = new Test3();?        Set<Integer> set=new LinkedHashSet<Integer>();        while(true){            if(set.size() == 10){                break;            }?            //乱序排列(随机)            int a=(int) (Math.random()*10);?            set.add(a);        }        for(int b:set){?            Thread th = new Thread(gsd, ary[b]);??            th.start();        }    }}

原文地址:https://www.cnblogs.com/nnnnmmmm/p/10998722.html

时间: 2024-10-25 07:01:41

多线程练习题的相关文章

java多线程练习题 类

package xiancheng; //以继承方式支持多线程 public class Test2 extends Thread{ //重写fun方法 //fun方法是用来被star()自动调用 @Override public void run() { //调用需要并发执行的语句 test(); } //测试方法 public void test() { // 线程测试 for(int i=1; i<=10; i++) { System.out.println(Thread.currentT

C#中一道关于多线程的基础练习题——模拟仓库存销过程

题目:模拟生产.入库.销售(50分) 假设某企业自产.自存.自销,需要将工厂生产的各类产品不定时的运到仓库,与此同时,需要将仓库中的货物运往超市和商场中进行销售,请编写一个程序模拟此过程(主要是存取这个过程). 评分标准: 1. 仓库的存量是固定的,可以假设为一个常量,比如10.(5分) 2. 仓库满的时候,不能再向仓库中存货.(10分) 3. 仓库空的时候,不能卖出货物.(10分) 4. 存货和取货是同时进行的,不要出现先存满再取完货再存满再取完的效果或者存一个取一个再存再取这样的效果.(15

练习题,使用多线程编写一个简单的文本处理工具

一. 练习题要求: 编写一个简单的文本处理工具,具备三个任务,一个接收用户输入,一个将用户输入的内容格式化成大写,一个将格式化后的结果存入文件 二. 分析: 三个任务,那就是三个线程.分别的输入,转换,写入,这3个线程.那么写入的输入,其他线程怎么取出?我们可以使用Queue队列,把用户输入的字符写入到队列中,然后再进行转换.转换完成后,再写入到另外一个队列中.等待最后写入文件三.实现 1 from threading import Thread 2 from multiprocessing i

Android——多线程编程练习题

随便选择两个城市作为预选旅游目标.实现两个独立的线程分别显示10次城市名,每次显示后休眠一段随机时间(1000ms以内),哪个先显示完毕,就决定去哪个城市.分别用Runnable接口和Thread类实现. layout文件: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/a

秒杀多线程第一篇 多线程笔试面试题汇总 ZZ 【多线程】

http://blog.csdn.net/morewindows/article/details/7392749 系列前言 本系列是本人参加微软亚洲研究院,腾讯研究院,迅雷面试时整理的,另外也加入一些其它IT公司如百度,阿里巴巴的笔试面试题目,因此具有很强的针对性.系列中不但会详细讲解多线程同步互斥的各种“招式”,而且会进一步的讲解多线程同步互斥的“内功心法”.有了“招式”和“内功心法”,相信你也能对多线程挥洒自如,在笔试面试中顺利的秒杀多线程试题. ----------------------

秒杀多线程第一篇 多线程笔试面试题汇总

版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 系列前言 本系列是本人参加微软亚洲研究院,腾讯研究院,迅雷面试时整理的,另外也加入一些其它IT公司如百度,阿里巴巴的笔试面试题目,因此具有很强的针对性.系列中不但会详细讲解多线程同步互斥的各种“招式”,而且会进一步的讲解多线程同步互斥的“内功心法”.有了“招式”和“内功心法”,相信你也能对多线程挥洒自如,在笔试面试中顺利的秒杀多线程试题. -------------------------------------华丽的分割线

多线程的一些问题

------------------------------------------------------------------------------------------ 1.使用同步代码块的方法解决同步线程的安全问题 package com.lanqiao.javatest;/* * 线程的同步,安全问题:打印车票出现重票,错票 * *///存在安全性问题的原因是什么: //使用同步代码块的方法实现进程同步出现的数据输出重复,不规范的问题class Win extends Threa

多线程笔试面试题汇总

第一篇    多线程笔试面试题汇总 本文转载于秒杀多线程系列,原博客地址:http://blog.csdn.net/morewindows/article/details/7392749 多线程在笔试面试中经常出现,下面列出一些公司的多线程笔试面试题.首先是一些概念性的问答题,这些是多线程的基础知识,经常出现在面试中的第一轮面试(我参加2011年腾讯研究院实习生招聘时就被问到了几个概念性题目).然后是一些选择题,这些一般在笔试时出现,虽然不是太难,但如果在选择题上花费大多时间无疑会对后面的编程题

python并发编程:多线程-开启线程的两种方式

一 threading模块介绍 multiprocess模块完全模仿了threading模块的接口,二者在使用层面,有很大的相似性 二 开启线程的两种方式 方式一 from threading import Thread import time def sayhi(name): time.sleep(2) print("%s say hello" % name) if __name__ == '__main__': t = Thread(target=sayhi, args=('mik