【Java多线程】01-创建线程的三种方式

继承Thread类创建线程类

1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务,

因此把run()方法称为执行体。

(2)创建Thread子类的实例,即创建了线程对象。

(3)调用线程对象的start()方法来启动该线程。

/**
 * 1、继承Thread+重写Run
* @author AnQi
* @createDate 2020年1月14日 下午12:19:26
*/
public class startThread extends Thread{
	/*
	 * *?(non-Javadoc)
	 * @see java.lang.Thread#run()
	 * 线程入口点
	 */
	@Override
	public void run() {
		// TODO Auto-generated method stub
		for(int i=0;i<20;i++){
			System.out.println("一边听歌");
		}
		super.run();
	}
	public static void main(String[] args) {
		//创建子类对象
		startThread st=new startThread();
		//调用Start启动
		st.start();//开启新线程,不保证立即运行 由CPU决定
	//	st.run();//普通方法调用
		for(int i=0;i<20;i++){
			System.out.println("一边coding");
		}
}
}

二、通过Runnable接口创建线程类

(1)定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。

(2)创建 Runnable实现类的实例,并依此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。

(3)调用线程对象的start()方法来启动该线程。

/**
 * 一、 共享资源/ 并发
* @author AnQi
* @createDate 2020年1月14日 下午2:43:02
*/
public class Web12306 implements Runnable{
	private int tickNums=99;
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(true ) {
			if(tickNums<0) {
				break;
			}
			try {
				Thread.sleep(200);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println(Thread.currentThread().getName()+"-->"+tickNums--);
		}
	} 
public static void main(String[] args) {
	//一份资源
	Web12306 web=new Web12306();
	//多个代码
	new Thread(web,"1one").start();
	new Thread(web,"2two").start();
	new Thread(web,"3three").start();
}
}

三、通过Callable和Future创建线程

1)创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。

(2)创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。

(3)使用FutureTask对象作为Thread对象的target创建并启动新线程。

(4)调用FutureTask对象的get()方法来获得子线程执行结束后的返回值

/**
 * 模拟龟兔赛跑
 * 
 * @author AnQi
 * @createDate 2020年1月14日 下午2:55:11
 */
public class CRacer implements Callable<Integer> {
	private static String winner;// 胜利者

	@Override
	public Integer call() {
		// TODO Auto-generated method stub
		for (int steps = 1; steps <= 100; steps++) {

			// 模拟休息
			if (Thread.currentThread().getName().equals("rabbit") && steps % 10 == 0) {
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			System.out.println(Thread.currentThread().getName() + "-->" + steps);
			// 比赛是否结束
			boolean flag = gameOver(steps);
			if (flag) {
				return steps;

			}
		}
		return null;
	}

	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) throws InterruptedException, ExecutionException {
		CRacer racer = new CRacer();
		// 创建执行服务
        ExecutorService ser = Executors.newFixedThreadPool(2);
        // 提交执行:
        Future<Integer> result1 = ser.submit(racer);
        Future<Integer> result2 = ser.submit(racer);
        // 获取结果
        Integer r1 = result1.get();
        Integer r2 = result2.get();
     
        System.out.println(r2);
        // 关闭服务
        ser.shutdownNow();

	}
}
发布了44 篇原创文章 · 获赞 7 · 访问量 846

猜你喜欢

转载自blog.csdn.net/ange2000561/article/details/104711133