线程的生命周期 与创建线程的三种方式

线程的生命周期

1.Java应用程序的main函数是一个线程,是被JVM启动的时候调用,线程的名字叫main
2.实现一个线程,必须创建Thread实例, override run方法,并且调用start方法
3.在JVM启动后,实际上有多个线程,但是至少有一个非守护线程
4.当你调用一个线程start方法的时候,此时至少有两个线程,一个是调用你的线程,还有一个执行run方法的线程
5.线程的生命周期分为new, runnable, running, block, terminated
(在深入理解jvm中还有一个Timed Waiting 限期等待)

在这里插入图片描述

创建线程的方式一

继承Thread 重写run方法 创建线程对象 调用star()方法启动线程

public class CreateThread extends Thread{
	@Override
	public void run() {
		
		System.out.println("run方法");
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		CreateThread t = new CreateThread();
		CreateThread t2 = new CreateThread();
		t.start();
		t2.start();
	
	}

}

创建线程的方式二

定义MyRunnable类实现Runnable接口
实现run()方法,编写线程执行体
创建线程对象,调用start()方 法启动线程

public class CreatThread2 implements Runnable{
	@Override
	public void run() {
		for(int i = 0;i < 200;i++) {
			System.out.println("===run" + i);
		}		
	}
	public static void main(String[] args) {
		// 创建runnbale接口的实现类对象
		CreatThread2 thread2 = new CreatThread2();		
		//创建线程对象 通过线程对象来开启我们的线程 代理
//		Thread thread = new Thread(thread2);
//		thread.start();
		//简写
		new Thread(thread2).start();
		for(int i = 0;i < 1000;i++) {
			System.out.println("main" + i);
		}
	}
}

两者对比

一 .继承Thread类
◆子类继承Thread类具备多线程能力
◆启动线程:子类对象. start()
◆不建议使用:避免OOP单继承局限性

二 .实现Runnable接口
◆实现接口Runnable具有多线程能力
◆启动线程:传入目标对象+ Thread对象.start()
◆推荐使用:避免单继承局限性,灵活方便,方便同- -个对象被多个线程使用

Tread.start()方法与main方法是同时进行的
而如果在main中先写run()方法再写常规输出 则是按顺序run先执行

在这里插入图片描述在这里插入图片描述

创建线程的方式三

实现Callable接口(了解即可)
1.实现Callable接口,需要返回值类型
2.重写call方法,需要抛出异常
3.创建目标对象
4.创建执行服务: ExecutorService ser =Executors.newFixedThreadPool(1);
5.提交执行: Future result1 = ser.submit(t1);
6.获取结果: boolean r1 = result1.get()
7.关闭服务: ser. shutdownNow();
好处:1.可以定义返回值 2.可以抛出异常

代码:同时下载两个图片:


public class ChreadThread3 implements Callable<Boolean>{
	private String url;
	private String name;
	public ChreadThread3(String url,String name) {
		this.name = name;
		this.url = url;
	}
	@Override
	public Boolean call() {
		WebDownloader1 webDownloader = new WebDownloader1();
		webDownloader.downloader(url, name);
		System.out.println("文件名为" + name);
		return true;
	}
	
	public static void main(String[] args) throws InterruptedException, ExecutionException {

		CreateThread t = new CreateThread("https://pics7.baidu.com/feed/810a19d8bc3eb13582b82bb437946bd5fc1f44d7.jpeg?token=ebcc1331d0959447cf540838897de3bf&s=C1A035722D5F5BC85C45C0DE0000D0B3", "2.jpg");
		CreateThread t2 = new CreateThread("https://img-blog.csdnimg.cn/20181203085220704.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1dfWV9MXw==,size_16,color_FFFFFF,t_70", "3.jpg");
		//创建执行服务
		ExecutorService ser = Executors.newFixedThreadPool(2);
		//提交执行
		Future<Boolean> r1 = (Future<Boolean>) ser.submit(t);
		Future<Boolean> r2 = (Future<Boolean>) ser.submit(t2);
		//获取结果
		boolean rs1 = r1.get();
		boolean rs2 = r2.get();
		
		//关闭服务
		ser.shutdown();
	}

}
class WebDownloader1{
	public void downloader(String url,String name) {
		try {
			FileUtils.copyURLToFile(new URL(url), new File(name));
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("io异常");
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值