java-多线程

一、多线程的创建

(1)继承Thread

package cn.zxq.thread;
/**
 * 创建线程方式一
 * 1.创建:继承Thread 重写run
 * 2.启动线程,创建子类对象,调用Start方法
 * @author MacBook
 *
 */
public class StartThread extends Thread{
	
	/**
	 * 线程入口点
	 */
	@Override
	public void run() {
		// TODO Auto-generated method stub
		for(int i =0;i<20;i++) {
			System.out.println("一边听歌");
		}
		
	}

	public static void main(String[] args) {
		
		//创建子类对象
		StartThread st = new StartThread();
		//启动线程
		st.start();//开启一个新的进程,各走各的。
		st.run();//直接调用run方法,必须听完歌才能敲代码
		
		for(int i =0;i<20;i++) {
			System.out.println("一边敲代码");
		}

	}

}

注意线程创建的实际要在代码运行之前开启一个新的线程

(2)Runnable 接口(推荐)

package cn.zxq.thread;
/**
 * 创建线程方式二
 * 1.创建:实现Runable 重写run
 * 2.启动线程,创建实现类对象+Tread对象,调用start方法
 * @author MacBook
 *
 */
public class Runable implements Runnable{
	/**
	 * 线程入口点
	 */
	@Override
	public void run() {
		// TODO Auto-generated method stub
		for(int i =0;i<20;i++) {
			System.out.println("一边听歌");
		}
		
	}
	
	
	public static void main(String[] args) {
//		//创建子类对象
//		StartThread st = new StartThread();
//		//创建代理类对象
//		Thread t = new Thread(st);
//		//启动线程
//		t.start();//开启一个新的进程,各走各的。
		t.run();//直接调用run方法,必须听完歌才能敲代码
		
		//对象只用一次的时候可以用匿名
		new Thread(new StartThread()).start();
		
		for(int i =0;i<20;i++) {
			System.out.println("一边敲代码");
		}
	}

	

}

抢票

package cn.zxq.thread;
/**
 * 黄牛抢票
 * 假设有100张票,3个黄牛,抢完即止
 * @author MacBook
 *
 *
 *共享资源,并发(问题)
 */
public class RobTickt implements Runnable {
	
	private int tickitNums=100;
	@Override
	public void run() {
		//写一个死循环,让票拿到没有了为止 
		while(true){
			if(tickitNums<0) {
				break;
			}
			//模拟网络延时
			try {
				Thread.sleep(200);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println(Thread.currentThread().getName()+"-->"+tickitNums--);//谁运行代表谁
		}
		
		
	}
	
	public static void main(String[] args) {
		//创建子类对象
		//一份资源
		RobTickt p = new RobTickt();
		//多个代理
		new Thread(p,"黄牛1").start();
		new Thread(p,"黄牛2").start();
		new Thread(p,"黄牛3").start();
		
	}

}

龟兔赛跑

package cn.zxq.thread;
/**
 * 龟兔赛跑的比赛
 * 跑到100步就赢了,但是兔子中途要睡觉,所以怎样都是乌龟赢
 * @author MacBook
 *
 */
public class Match implements Runnable{
	private String winner;//有个赢家
	@Override
	public void run() {
		for(int step=1;step<=100;step++) {
			//模拟休息
			if(Thread.currentThread().getName().equals("rabbit") && step%50==0) {//如果是兔子,兔子走到50步开始睡觉
				try {
					Thread.sleep(10);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
			System.out.println(Thread.currentThread().getName()+"-->"+step);
			//比赛是否结束呢?
			boolean flag = gameOver(step);
			if(flag) {
				break;
			}
			
		}

	
	}
		


	/**
	 * 判断游戏是否结束
	 */
	private boolean gameOver(int steps) {
		if(winner!=null) {//存在赢家
			return true;
			
		}else {
			if(steps==100) {
				winner = Thread.currentThread().getName();
				System.out.println("winner=="+winner);
				return true;
			}
			return false;
		}
	}
	
	public static void main(String[] args) {
		Match racer = new Match();
		new Thread(racer,"tortoise").start();
		new Thread(racer,"rabbit").start();
		
	}
}

你可能感兴趣的:(java基础)