package com.it.demo.for6and8;
// 继承 thread 类
//java的jdk开发包已经自带了多线程技术支持
//实现方式有两种 一、继承thread类 二、实现runnable 接口
//学习如何创建线程前,先看看thread类的声明结构代码如下
//public class Thread implements Runnable
//从上面的源代码中可以发现,Thread 实现了 Runnable 接口 ,
// 他们之间具有多态关系,多态结构的实例代码如下:
// Runnable run1 =new Thread();
// Runnable run2 =new MyThread();
// Thread t1 =new Mythread();
// 其实使用继承Thread类的方式创建线程时,最大的局限就是不支持多继承,因为java语言的特点就是单继承
//所以为了支持多继承,完全可以实现Runnable接口的方式 一边实现一边继承,
//这两种方式创建线程的功能是一样的,没有本质的区别
import java.util.concurrent.TimeUnit;
//创建一个自定义线程类Mythread类 此类继承 thread 并重写run方法。run方法中添加线程要执行的任务代码 如下:
public class Mythread extends Thread{
@Override
public void run() {
super.run();
System.out.println("Mythread");
}
}
// 运行类代码如下:
class Run{
public static void main(String[] args) {
Mythread mythread =new Mythread();
mythread.start(); //耗时大
System.out.println("运行结束"); //耗时小
}
}
//上面的代码使用start 方法来启动一个线程,线程驱动后会调用线程对象的run()方法
//run()方法里面的代码就是线程对象要执行的任务,是线程执行的入口。
// run的main方法执行结果 是 先输出 运行结束 在输出 mythread
// 为什么run方法的执行时间相对于输出“运行结束”的时间晚?
// 原因:
// 方法start()耗时多的原因是内部执行了多个步骤,
// 步骤如下:
// 1.1 通过jvm告诉操作系统创建Thread;
// 1.2 操作系统开辟内存并使用Windows SDK中的 createThread() 函数 创建Thread对象
// 1.3 操作系统对Thread对象进行调度,以确定时机
// 1.4 Thread在操作系统中被成功执行
// 以上步骤的完整执行所使用的时间一定大于输出“运行结束!“字符串的时间
// 另外,main线程执行start()方法时不必等到上述步骤都执行完成,而是立即执行start()方法后面的代码,
// 这四个步骤和输出”运行结束“的代码一同执行,由于输出”运行结果“耗时比较少,所以大多数情况下都是先输出”运行结束“后输出”mythread“
//但在这里还是有非常非常渺茫的技术先输出mythread 在输出”运行结束“
//虽然输出这种结果的概率比较小但也说明 线程执行的顺序具有随机性
//使用手动的方式来重复执行Run难以重现 可以人为操作
//可以在执行打印代码之前先执行thread。sleep(300) 让run()方法有充分的时间去执行
//示列代码如下
class run2{
public static void main(String[] args) throws InterruptedException {
Mythread mythread =new Mythread();
mythread.start();
Thread.sleep(200);//让mythread.start有重复时间执行
System.out.println("执行结束");
}
// 建议用如下代码实现sleep操作
public void cc() throws InterruptedException {
System.out.println("begin" +System.currentTimeMillis());
TimeUnit.SECONDS.sleep(5);
//Thread.sleep()方法的参数时毫秒,代码可读性不好,
// 而TimeUnit可以更加方便的使用指定的时间单位来实现sleep操作,代码可读性好.
// 其他的时间单位为NANOSENCONDS ,MICROSECONDS,MILLISECONDS,SECONDS,MINUTES,HOURS,DAYS
System.out.println("end" +System.currentTimeMillis());
}
// 在使用多线程技术时,代码的运行结果与代码执行顺序或调用顺序无关。
// 另外,线程是一个子任务,cpu是以不确定的方式或以随机的时间来调用线程中的run()方法
// 所以先输出“Mythread” 和先输出“运行结束!” 具有不确定性。
// 如果多次调用start方法会抛出一次 exception in thread "main" java.lang.illegalThread-StateException
}
java多线程编程技术 6-8页(实现线程,thread的start启动步骤,多次调用start的异常,thread.sleep替换成更有 可读性的代码)
于 2022-03-24 14:21:34 首次发布
本文详细介绍了Java中通过继承Thread类和实现Runnable接口创建线程的方法,探讨了多线程执行的顺序和不确定性的原因。通过示例代码展示了线程启动的步骤,强调了线程执行的随机性和start方法与run方法的执行差异。同时,解释了为何在某些情况下可能会先输出run方法的内容。最后,讨论了多线程执行顺序的不可预测性,并提醒避免多次调用start方法可能导致的IllegalThreadStateException。

被折叠的 条评论
为什么被折叠?



