线程的生命周期
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异常");
}
}
}