实验七多线程编程_JAVA

实验目的:

(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();

	}
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值