Java复习之知识点整理(六)----多线程的创建

一、线程创建步骤
---------------------------------------
1.新建线程类,继承Thread
2.在新建的类中,重写run()方法作为分线程的主体
3.在主函数中new 线程类
4.调用start方法,开启线程。注意不是run方法开启线程

二、守护线程setDaemon
----------------------------------------
1.守护线程:同正常线程一样,只不过它会在所有非守护线程结束之后,强制自动结束。
2.可以 设置线程是否为守护线程setDaemon(true);
3.可以在线程的构造函数中设置为守护线程,这样新建的线程都是守护线程
4.当程序仅剩守护线程的时候,也意味着程序结束
5.语法:xxx.setDaemon(true/false);

三、阻塞主线程join
-----------------------------------------------
1.线程对象调用join()方法,会阻塞主线程,但不会阻塞其他分线程。
2.主线程见到join会一直等待join结束,再执行join之后的代码
3.语法:xxx.join();

四、线程休眠sleep
------------------------------------------------
1.静态方法,语法:Thread.sleep(ms);
2.表示让当前线程休眠 xx ms,在休眠期间放弃cpu资源的抢占
3.休眠时间结束,自动唤醒,开始抢占cpu资源

代码示例:
public class Day09 {

	public static void main(String[] args) {
		// 1.新建线程
		// 可以在构造函数里进行守护线程的设置
		MyThread p1 = new MyThread("11", 11111);
		MyThread p2 = new MyThread("22", 22222);
		MyThread p3 = new MyThread("33", 333);
		MyThread p4 = new MyThread("44", 4444);
		// 2,开启线程
		// 注意这里使用的是start();而不是run();
		p1.start();
		p2.start();
		p3.start();
		p4.start();
		// 3,阻塞主线程,等分线程执行完毕再去执行主线程
		// join的作用是阻塞主线程,但仅仅是阻塞主线程,不会阻塞其他分线程
		try {
			p1.join();
			System.out.println("111~~");
			p2.join();
			System.out.println("222~~");
			p3.join();
			System.out.println("333~~");
			p4.join();
			System.out.println("444~~");
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("比赛开始~~");
		Room r = new Room("10", 10000);
		Timer t = new Timer();
		// 4.设置守护线程:当所有非守护线程都结束之后,守护线程自动结束
		// 当程序仅剩守护线程的时候,也意味着程序结束
		t.setDaemon(true);
		r.start();
		t.start();
	}
}

class Room extends Thread {
	private String num;
	public int time;

	public Room(String num, int time) {
		this.num = num;
		this.time = time;
	}

	public void run() {
		System.out.println(num + "房间顾客正在唱歌~~~");
		try {
			Thread.sleep(time);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(num + "房间顾客走了,计时结束~!");
	}
}

class Timer extends Thread {
	private int count = 0;

	public Timer() {
		// 设置为守护线程
		this.setDaemon(true);
	}

	public void run() {
		while (true) {
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println("计时:" + ++count);
		}
	}
}

class MyThread extends Thread {
	private String name;
	private int time;

	public MyThread(String name, int time) {
		this.name = name;
		this.time = time;
	}

	public void run() {
		System.out.println("玩家" + name + "正在路上");
		try {
			Thread.sleep(time);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("玩家" + name + "到了~~");
	}
}



全文完!




猜你喜欢

转载自blog.csdn.net/xcvbxv01/article/details/80849842