实验七 Java 多线程程序设计应用
一、实验目的
1 、理解线程、线程的生命周期等概念。
2、掌握线程的两种实现方法。
3、掌握线程的调度和控制方法。
4 、理解多线程的互斥和同步的实现原理。
二、实验学时
2 学时
三、实验类型 验证性实验
四、实验需求
1、硬件
每位学生配备计算机一台
2、软件
Windows 7 操作系统, JDK,eclipse ,MySQL
3、网络
无
4、工具
无
五、实验理论与预备知识
1、进程与线程的区别。
2 、java 多线程的两种实现方式及区别。
3、共享变量的处理。
六、实验内容与结果
1、编写应用程序,设计 4 个线程对象,两个线程执行减操作, 两个线程执行加操作。
package test;
//做法作用:保证是一个东西
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));
}
public synchronized void cheng()
{
System.out.println(Thread.currentThread().getName()+"对j*1,当前j="+(j));
}
public synchronized void chu()
{
System.out.println(Thread.currentThread().getName()+"对j/1,当前j="+(j));
}
}
class Add implements Runnable
{
private Data data;
public Add(Data data)
{
this.data=data;
}
public void run()
{
data.add();
}
}
class Dec implements Runnable
{
private Data data;
public Dec(Data data)
{
this.data=data;
}
public void run()
{
data.dec();
}
}
class Cheng implements Runnable
{
private Data data;
public Cheng(Data data)
{
this.data=data;
}
public void run()
{
data.cheng();
}
}
class Chu implements Runnable
{
private Data data;
public Chu(Data data)
{
this.data=data;
}
public void run()
{
data.chu();
}
}
public class Work_8_0
{
public static void main(String[] args)
{
Data data = new Data();
Add add = new Add(data);
Dec dec = new Dec(data);
Cheng cheng=new Cheng(data);
Chu chu=new Chu(data);
for (int i = 0; i < 400; ++i)
{
new Thread(add, "线程A").start();
new Thread(dec, "线程B").start();
new Thread(cheng, "线程C").start();
new Thread(chu, "线程D").start();
}
}
}
2、设计一个生产电脑和搬运电脑类,要求生产出一台电脑就搬走一台电脑,
如果没有新的电脑生产出来,则搬运工要等待新电脑产出;
如果生产出的电脑没有搬走,电脑搬走之后再生产并统计出生产的电脑数量。
package test;
class Computer
{
private String name;
//设置标志位,通过标志位完成等待与唤醒的操作
private boolean flog=true;//初始的时候需要生产
private static int sum=1;
public Computer(String name)
{
this.name=name;
}
public synchronized void set()//生产
{
//有电脑,等待搬走
if(flog==false)
{
try
{
super.wait();//等待搬走
}
catch (Exception e)
{
e.printStackTrace();
}
}
try
{
Thread.sleep(1000);
}
catch(Exception e)
{
e.printStackTrace();
}
System.out.println("生产了"+this.name+",现在已经生产了"+(sum)+"台电脑");
flog = false;//有电脑
sum++;
super.notify();//唤醒搬走线程
}
public synchronized void get()//搬走
{
if(flog)//没有电脑
{
try
{
super.wait();//等待生产
}
catch (Exception e)
{
e.printStackTrace();
}
}
try
{
Thread.sleep(1000);//睡眠
}
catch (Exception e)
{
e.printStackTrace();
}
System.out.println("搬走了"+this.name+" ");
flog=true;//没电脑
super.notify();//唤醒生产
}
}
class ThreadCom implements Runnable
{
public void run()
{
for(int i=1;i<=10;i++)
{
Computer c = new Computer("电脑"+i);
c.set();//生产
c.get();//搬走
System.out.println("------------------分割-------------------------");
}
}
}
public class Work_8_1
{
public static void main(String[] args)
{
ThreadCom t1 = new ThreadCom();
new Thread(t1).start();
}
}
3、简述死锁的产生。
所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。死锁是由于两个或以上的线程互相持有对方需要的资源,导致这些线程处于等待状态,无法执行。