《java实验多线程开发.docx》由会员分享,可在线阅读,更多相关《java实验多线程开发.docx(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、实验名称第 5次实验多线程开发一、实验目的.掌握所线程的概念;1 .掌握线程实现的两种方法;3、掌握对象锁和线程同步。二、实验内容1、编写程序,创建5个线程,分别输出5个线程的名字,用继承Thread类和实现Runnable 接口的方法来实现。2、以车站售票为例研究资源共享的问题。假设两个窗口同时出售一次列车的车票,车票就 是共享资源,两个窗口就是两个线程。3、编写程序,实现线程间的同步控制。假设有一个生产者(Producer), 一个消费者 (Consumer)。生产者产生0-9的整数,将它们存储在盒子(Box)对象中并打印出这些数。消费者从盒子中取出这些整数并将其也打印出来。同时要求生产者
2、产生一个数字,消费者 取得一个数字。三、实验过程1、编写程序,创建5个线程,分别输出5个线程的名字,用继承Thread类和实现Runnable 接口的方法来实现。(1)代码设计方法一:public class ThreadDemo extends Thread public ThreadDemo(String name) super(name);)public void run() for(int i=0;i100;i+) /System.out.printin(getName()+=+i);try (Thread.steep(int)(Math.random()*100);catch(Int
3、erruptedException e)System.out. printin(getName() + 结束);)public staticThread tlThread t2Thread t3Thread t4Thread t5void main(String args) =new ThreadDemo(“线程 A); =new ThreadDemo(线程 B); =new ThreadDemo(“线程 C); =new ThreadDemo,线程 D); =new ThreadDemo(“线程 E);tl.start();t2.start();t3.start();t4.start();)
4、方法二:publict5.start();class RunnableDemo implements Runnable public void run() for(int i=0;i100;i+) /System.out.printIn(Thread.currentThread().getName()+=+i);try Thread. steep( (int) (Math. rando/n( )*100);catch(InterruptedException e) System.out. println(Thread. currentThreadO .getName() + ”结束);publ
5、ic static void main(String args) RunnableDemo target=new RunnableDemo。; tl.start();ThreadThreadThreadThreadThreadtlt2t3t4t5newnewnewnewnewThreadDemo(“线程 A); ThreadDemo(“线程 B“); ThreadDemo,线程 Cn); ThreadDemo(“线程 D“); ThreadDemo(“线程 E);t2.start();t3.start();t4.start();t5.start();)(2)运行结果方法一:而一 Problem
6、s terminated: 线程C结束 线程B结束 线程E结束 线程A结束 线程D结束方法二:RRRR-R 吐口吐口吐口吐口吐口 登乡乡 D E c A B 口王口王口王口王口王 L 二/ L H 一了 、二K、二K 二B、二K 二K 线线线线线RRRR-R 吐口吐口吐口吐口吐口 登乡乡 D E c A B 口王口王口王口王口王 L 二/ L H 一了 、二K、二K 二B、二K 二K 线线线线线2、以车站售票为例研究资源共享的问题。假设两个窗口同时出售一次列车的车票,车票就 是共享资源,两个窗口就是两个线程。(1)代码设计public class Tickets private int amo
7、unt=100; public int getAmount() return amount;public void saleone() amount=amount-l;)public class WinThread extends Thread Tickets tickets=null;int n=0;public WinThread(Tickets ticketsString name) super(name);this.tickets=tickets;public void run() while(true) if(tickets.getAmount()0) tickets . saleo
8、ne(); n=n+l;System.out.printIn(getName()+:+n); try Thread.steep(50);catch(InterruptedException e) else Sy stem. out. print In (getName() + 已无票”); break; )public class TicketsTest public static void main(String args) Tickets tick=new Tickets();Thread winl=new WinThread(tick,窗口!”);Thread win2=new WinT
9、hread(tickJ窗口2); winl.start();win2.start();)(2)运行结果terminate言匚1:1言匚2:1 宣匚1:2盅匚2:2宙匚1:3宙匚2:3言匚1:4宣匚2:4支匚1:5窗匚2:5 窗匚1:6言二 2:6言匚1:7 言匚2:7盅匚1:8*2:8宙匚1:9言二2:9 $31:10变二2:10 窗匚1:11定二2:11 $31:12言二2:12直二1:13宣二 2:13宣匚1:14定二2:14言二 1:15宣二 2:15 克匚1:16定二2:16定二2:17言匚1:17言二2:18宣二1:18 zl:19宣匚2:19定二1:20官二 2:20 或二1:21
10、terminate言匚1:1言匚2:1 宣匚1:2盅匚2:2宙匚1:3宙匚2:3言匚1:4宣匚2:4支匚1:5窗匚2:5 窗匚1:6言二 2:6言匚1:7 言匚2:7盅匚1:8*2:8宙匚1:9言二2:9 $31:10变二2:10 窗匚1:11定二2:11 $31:12言二2:12直二1:13宣二 2:13宣匚1:14定二2:14言二 1:15宣二 2:15 克匚1:16定二2:16定二2:17言匚1:17言二2:18宣二1:18 zl:19宣匚2:19定二1:20官二 2:20 或二1:21$32:21 官二 1:22 定二 2:22 $31:23 童二 2:23 $31:24 童二 2:2
11、4 宙二 1:25 言二 2:25 童二 2:26 *1:26 11:27 官二 2:27 定二 1:28 官二 2:28 *1:29 言二 2:29 $zl:30 宣二 2:30 Wzl:31 官二 2:31 $zl:32 W=2:32 友二 1:33 定二 2:33 $z2:34 童二 1:34 宦二 2:35 $zl:35 言二 2:36 Wol:36 值二 2:37 支二 1:37 $z2:38 发二 1:38 WD1:39 $z2:39 窗二 1:40 官二2:40 童二工:41夜二 2:41 $zl:42宣二 2:42 $zl:43 z2:43夜二 1:44 童二 2:44$zl:
12、45 夜二 2:455zl:46 宣二 2:46 $zl:47夜二 2:47 931:48宣二 2:48 $zl:49夜二 2:49 窗二 1:50童二 2:50*1:51 3 2:51 窗二 1:52官二2三天亲 窗二1己无宗3、编写程序,实现线程间的同步控制。假设有一个生产者(Producer), 一个消费者 (Consumer)。生产者产生09的整数,将它们存储在盒子(Box)对象中并打印出这些数。消费者从盒子中取出这些整数并将其也打印出来。同时要求生产者产生一个数字,消费者 取得一个数字。(1)代码设计public class Box private int data;public s
13、ynchronized void put(int value) data=value;public synchronized int get() return data;)public class Producer extends Thread private Box box;public Producer(Box c) box=c;)public void run() for(int i=0;i10;i+) box.put(i);System.out.printIn(Producer+put:”+i);try (sLeep( (int) (Math .rando/w( )*100); cat
14、ch(InterruptedException e) ) )public class ProducerConsumerTest public static void main(String args) Box c=new Box();Producer pl=new Producer(c);Consumer cl=new Consumer(c);pl.start(); cl.start();)public class Consumer extends Thread private Box box;public Consumer(Box c)box=c;)public void run()int
15、value=0;for(int i=0;i10;i+) value=box.get(); System.out.println(Consumer+get:+value); tryseep(int)(Math.random()*100);catch (InterruptedException e) )public class Box2 private int data; private boolean available=false;public synchronized void put(int value) while(available=true) try wait();catch(Int
16、erruptedException e) data=value;available=true; notifyAll(); ) public synchronized int get() while(available=false) try wait();catch(InterruptedException e) available=false;notifyAll(); return data; (2)运行结果 Pro Consumerget:0 Producerput:0 Producerput:1 Consumerget:1 Producerput:2 Producerput:3 Consumerget:3 Consumerget:3 Consumerget:3 Producerput:4 Producerput:5 Producerput:6 Consumerget:6 Producerput:7 Consumerget:7 Producerput:8 Consumerget:8 Consumerget:8 Consumerget:8 Producerput:9四、实验小结本次实验我掌握了所线程的概念;掌握了线程实现的两种方法;掌握了对象锁和线程 同步。