实验目的:
(1)了解进程和线程的概念
(2)了解多线程编程的特点
(3)利用Thread类和Runnable接创建多线程类
(4)掌握线程类的常用方法
(5)掌握多线程同步的方法
实验内容:
1、利用多线程类实现20个偶数和20个奇数的随机输出。
2、利用多线程编程实现多个窗口卖票的问题:
(1)三个窗口同时各卖10张票;
(2)三个窗口共同卖10张票。
3、编写多线程程序,实现生产者、消费者线程,并实现线程的同步:
(1)生产者线程产生20个数,消费者线程输出生产者线程产生的这20个数。
(2)使用线程的同步与协调机制使二者达到如此效果:产生一个数,取出一个数。
1、利用多线程类实现20个偶数和20个奇数的随机输出
//1.继承Thread
package sdut.cn;
class EvenOddThread extends Thread {
int value;
public EvenOddThread(int value, String name) {
super(name);
this.value = value;
}
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName() + "--" + value);
value += 2;
}
}
}
public class Main {
public static void main(String[] args) {
EvenOddThread evenThread = new EvenOddThread(1, "奇数线程");
EvenOddThread oddThread= new EvenOddThread(0, "偶数线程");
evenThread.start();
oddThread.start();
}
}
//2.利用Runnable接口
package sdut.cn;
class EvenOddRunnable implements Runnable {
int value;
public EvenOddRunnable(int value) {
this.value = value;
}
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName() + "--" + value);
value += 2;
}
}
}
public class Main {
public static void main(String[] args) {
EvenOddRunnable evenRunnable = new EvenOddRunnable(1);
EvenOddRunnable oddRunnable = new EvenOddRunnable(0);
Thread t1 = new Thread(evenRunnable, "奇数线程");
Thread t2 = new Thread(oddRunnable, "偶数线程");
t1.start();
t2.start();
}
}
2、利用多线程编程实现多个窗口卖票的问题:
(1)三个窗口同时各卖10张票
package sdut.cn;
class TicketRunnable implements Runnable {
private int num = 1;
@Override
public void run() {
while (num <= 10) {
System.out.println(Thread.currentThread().getName() + "正在销售第" + num + "号票");
num++;
}
}
}
public class Main {
public static void main(String[] args) {
TicketRunnable tr1 = new TicketRunnable();
TicketRunnable tr2 = new TicketRunnable();
TicketRunnable tr3 = new TicketRunnable();
Thread t1 = new Thread(tr1, "窗口1");
Thread t2 = new Thread(tr2, "窗口2");
Thread t3 = new Thread(tr3, "窗口3");
t1.start();
t2.start();
t3.start();
}
}
(2)三个窗口共同卖10张票
package sdut.cn;
class TicketRunnable implements Runnable {
private int num = 1;
@Override
public void run() {
while(num <= 10) {//建议<=10000这样效果明显
System.out.println(Thread.currentThread().getName() + "正在销售第" + num + "号票");
num++;
}
}
}
public class Main {
public static void main(String[] args) {
TicketRunnable ticketRunnable = new TicketRunnable();
Thread t1 = new Thread(ticketRunnable, "窗口1");
Thread t2 = new Thread(ticketRunnable, "窗口2");
Thread t3 = new Thread(ticketRunnable, "窗口3");
t1.start();
t2.start();
t3.start();
}
}
3、编写多线程程序,实现生产者、消费者线程,并实现线程的同步:
(1)生产者线程产生20个数,消费者线程输出生产者线程产生的这20个数。
package sdut.cn;
class Buffer {
int value[];
public int[] getValue() {
return value;
}
public void setValue(int[] value) {
this.value = value;
}
}
class SetThread extends Thread {
Buffer buffer;
int temp[] = new int[25];
public SetThread(Buffer buffer) {
super();
this.buffer = buffer;
}
@Override
public void run() {
for (int i = 0; i < 20; i++) {
temp[i] = i;
System.out.println("生产商品" + i);
}
buffer.setValue(temp);
}
}
class GetThread extends Thread {
Buffer buffer;
public GetThread(Buffer buffer) {
super();
this.buffer = buffer;
}
@Override
public void run() {
int[] temp = buffer.getValue();
for(int i = 0; i < 20; i++) {
System.out.println("消费商品" + temp[i]);
}
}
}
public class Main {
public static void main(String[] args) {
Buffer buffer = new Buffer();
SetThread setThread = new SetThread(buffer);
GetThread getThread = new GetThread(buffer);
setThread.start();
getThread.start();
}
}
(2)使用线程的同步与协调机制使二者达到如此效果:产生一个数,取出一个数。
package sdut.cn;
class Buffer {
int value;
boolean flag = false;
public synchronized int getValue() {
if (!flag) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("消费商品" + value);
flag = false;
notify();
return value;
}
public synchronized void setValue(int value) {
if(flag) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.value = value;
System.out.println("生产商品" + value);
flag = true;
notify();
}
}
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);
}
}
}
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();
}
}
}
public class Main {
public static void main(String[] args) {
Buffer buffer = new Buffer();
SetThread setThread = new SetThread(buffer);
GetThread getThread = new GetThread(buffer);
setThread.start();
getThread.start();
}
}