实验目的:
(1)了解进程和线程的概念
(2)了解多线程编程的特点
(3)利用Thread类和Runnable接创建多线程类
(4)掌握线程类的常用方法
(5)掌握多线程同步的方法
实验内容:
1、利用多线程类实现20个偶数和20个奇数的随机输出。
2、利用多线程编程实现多个窗口卖票的问题:
(1)三个窗口同时各卖10张票;
(2)三个窗口共同卖10张票。
3、编写多线程程序,实现生产者、消费者线程,并实现线程的同步:
(1)生产者线程产生20个数,消费者线程输出生产者线程产生的这20个数。
(2)使用线程的同步与协调机制使二者达到如此效果:产生一个数,取出一个数。
一、
Mian类:
public class Main {
public static void main(String[] args) {
EvenOddThread EvenThread = new EvenOddThread("奇数", 1);
EvenOddThread OddThread = new EvenOddThread("偶数",0);
EvenThread.start();
OddThread.start();
}
}
EvenOddThread类:
public class EvenOddThread extends Thread{
int value;
public EvenOddThread(String name, int value) {
super(name);
this.value = value;
}
public void run() {
String name = Thread.currentThread().getName();
for(int i=0;i<20;i++) {
try {
Thread.sleep(1);
} catch (Exception e) {
// TODO: handle exception
}
System.out.println(name+value);
value += 2;
}
}
}
二-(1)
TicketTest类:
public class TicketTest {
public static void main(String[] args) {
TicketRunnable ticket1 = new TicketRunnable();
TicketRunnable ticket2 = new TicketRunnable();
TicketRunnable ticket3 = new TicketRunnable();
Thread thread1 = new Thread(ticket1,"1号窗口");
Thread thread2 = new Thread(ticket2,"2号窗口");
Thread thread3 = new Thread(ticket3,"3号窗口");
thread1.start();
thread2.start();
thread3.start();
}
}
TicketRunable类:
public class TicketRunnable implements Runnable{
int count = 0;
@Override
public void run() {
while(count < 10) {
System.out.println(Thread.currentThread().getName()+count);
count++;
}
}
}
二-(2)
TicketTest类:
public class TicketTest {
public static void main(String[] args) {
TicketRunnable ticket = new TicketRunnable();
Thread thread1 = new Thread(ticket,"1号窗口");
Thread thread2 = new Thread(ticket,"2号窗口");
Thread thread3 = new Thread(ticket,"3号窗口");
thread1.start();
thread2.start();
thread3.start();
}
}
TicketRunnable类:
public class TicketRunnable implements Runnable{
int count = 0;
@Override
public void run() {
while(count < 10) {
System.out.println(Thread.currentThread().getName()+count);
count++;
}
}
}
三-(1)
Main类:
public class Main {
public static void main(String[] args) {
Buffer buffer = new Buffer();
SetThread set = new SetThread(buffer);
GetThread get = new GetThread(buffer);
set.start();
get.start();
}
}
Buffer类:
public class Buffer {
int value;
public Buffer() {
super();
}
public int getValue() {
System.out.println("get--"+value);
return value;
}
public void setValue(int value) {
System.out.println(" set--"+value);
this.value = value;
}
}
SetThread类:
public class SetThread extends Thread{
Buffer buffer;
public SetThread(Buffer buffer) {
super();
this.buffer = buffer;
}
@Override
public void run() {
for(int i=0;i<20;i++)
buffer.setValue(i);
}
}
SetValue类:
public class GetThread extends Thread{
Buffer buffer;
public GetThread(Buffer buffer) {
super();
this.buffer = buffer;
}
@Override
public void run() {
for(int i=0;i<20;i++)
buffer.getValue();
}
}
三-(2)
Main类:
public class Main {
public static void main(String[] args) {
Buffer buffer = new Buffer();
SetThread set = new SetThread(buffer);
GetThread get = new GetThread(buffer);
set.start();
get.start();
}
}
Buffer类:
public class Buffer {
int value;
boolean flag = false;
public Buffer() {
super();
}
public synchronized int getValue() {
if(!flag) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("get--"+value);
flag = false;
notify();
return value;
}
public synchronized void setValue(int value) {
if(flag) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(" set--"+value);
this.value = value;
flag = true;
notify();
}
}
SetThread类:
public class SetThread extends Thread{
Buffer buffer;
public SetThread(Buffer buffer) {
super();
this.buffer = buffer;
}
@Override
public void run() {
for(int i=0;i<20;i++)
buffer.setValue(i);
}
}
GetThread类:
public class GetThread extends Thread{
Buffer buffer;
public GetThread(Buffer buffer) {
super();
this.buffer = buffer;
}
@Override
public void run() {
for(int i=0;i<20;i++)
buffer.getValue();
}
}