一、实验目的
1 、理解线程、线程的生命周期等概念。
2、掌握线程的两种实现方法。
3、掌握线程的调度和控制方法。
4 、理解多线程的互斥和同步的实现原理。
二、实验学时
2 学时
三、实验类型 验证性实验
四、实验需求
1、硬件
每位学生配备计算机一台
2、软件
Windows 7 操作系统, JDK,eclipse ,MySQL
3、网络
无
4、工具
无
五、实验理论与预备知识
1、进程与线程的区别。
2 、java 多线程的两种实现方式及区别。
3、共享变量的处理。
六、实验内容与结果
1、编写应用程序,设计 4 个线程对象,两个线程执行减操作, 两个线程执行加操作。
package xxbb;
class Data{
private int j=0;
public synchronized void add(){
System.out.println(Thread.currentThread().getName()+"对j加1,当前j="+(++j));
}
public synchronized void dec() {
System.out.println(Thread.currentThread().getName()+"对j减1,当前j="+(--j));
}
}
class Add implements Runnable{
private Data data;
Add(Data data){
this.data=data;
}
public void run() {
data.add();
}
}
class Dec implements Runnable {
private Data data;
Dec(Data data){
this.data=data;
}
public void run() {
data.dec();
}
}
public class aa {
public static void main(String[] args) {
// TODO Auto-generated method stub
Data data=new Data();
Add add=new Add(data);
Dec dec=new Dec(data);
for(int i=0;i<2;i++) {
new Thread(add,"线程A").start();
new Thread(dec,"线程B").start();
}
}
}
2、设计一个生产电脑和搬运电脑类,要求生产出一台电脑就搬走一台电脑, 如果没有新的
电脑生产出来, 则搬运工要等待新电脑产出; 如果生产出的电脑没有搬走, 电脑搬走之后再生 产,并统计出生产的电脑数量。
class Computer{
private String name="电脑";
private static int sum =1;
private boolean flag =false;
public synchronized void set() {
if(flag)
{
try {
super.wait();
}
catch(InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(1000);
}
catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println("生产了一台"+name+",现在已经生产了"+sum+"台电脑");
sum++;
flag=true;
super.notify();
}
public synchronized void get() {
if(!flag)
{
try {
super.wait();
}
catch(InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(1000);
}
catch(InterruptedException e) {
e.printStackTrace();
}
flag=false;
super.notify();
System.out.println("搬走了一台"+name);
}
}
class made implements Runnable{
private Computer computer=null;
public made(Computer computer) {
this.computer=computer;
}
public void run()
{
for(int i=0;i<10;i++)
{
this.computer.set();
}
}
}
class move implements Runnable{
private Computer computer=null;
public move(Computer computer) {
this.computer=computer;
}
public void run()
{
for(int i=0;i<10;i++)
{
this.computer.get();
}
}
}
public class dddd {
public static void main(String[] args) {
// TODO Auto-generated method stub
Computer c=new Computer();
made t1=new made(c);
move t2=new move(c);
new Thread(t1).start();
new Thread(t2).start();
}
}
- 简述死锁的产生。
死锁产生的原因主要是竞争资源,其产生的条件包括资源互斥、请求保持、不能剥夺和循环等待。 死锁产生的根本原因是资源竞争。 如果若干个线程正常运行,遇到彼此需要对方占有的资源时,就可能产生线程死锁。 如果若干个线程异常运行,资源的请求与释放的顺序不当,也可能产生死锁。