实验七 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、简述死锁的产生。

所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。死锁是由于两个或以上的线程互相持有对方需要的资源,导致这些线程处于等待状态,无法执行。