🦛创建新线程
2021-3-13
| 2023-8-3
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property
 
Java语言内置了多线程支持。当Java程序启动的时候,实际上是启动了一个JVM进程,然后,JVM启动主线程来执行main()方法,在main()方法中又可以启动其他线程。
要创建一个新线程非常容易,需要实例化一个Thread实例,然后调用它的start()方法:
这个线程启动后实际上什么也不做就立刻结束了。
 
我们希望新线程能执行指定的代码,有以下几种方法:
方法一:从Thread派生一个自定义类,然后覆写run()方法
 
方法二:创建Thread实例时,传入一个Runnable实例
或者用Java8引入的lambda语法进一步简写为:
 
 
使用线程执行的打印语句,和直接在main()方法执行有区别吗?
线程的执行顺序:
  1. main线程肯定是先打印main start,再打印main end
  1. t线程肯定是先打印thread run,再打印thread end
但是,除了可以肯定,main start会先打印外,main end打印在thread run之前、thread end之后或者之间,都无法确定。因为从t线程开始运行以后,两个线程就开始同时运行了,并且由操作系统调度,程序本身无法确定线程的调度顺序。
要模拟并发执行的效果,可以在线程中调用Thread.sleep(),强迫当前线程暂停一段时间:
sleep()传入的参数是毫秒。调整暂停时间的大小,可以看到main线程和t线程执行的先后顺序。
 
要特别注意:直接调用Thread实例的run()方法是无效的:
直接调用run()方法,相当于调用了一个普通的Java方法,当前线程并没有任何改变,也不会启动新线程。上述代码实际上是在main()方法内部又调用了run()方法,打印hello语句是在main线程中执行的,没有任何新线程被创建。
必须调用Thread实例的start()方法才能启动新线程,如果我们查看Thread类的源代码,会看到start()方法内部调用了一个private native void start0()方法,native修饰符表示这个方法是由JVM虚拟机内部的C代码实现的,不是由Java代码实现的。
 

线程的优先级

可以对线程设定优先级,设定优先级的方法是:
优先级高的线程被操作系统调度的优先级较高,操作系统对高优先级线程可能调度更频繁,但决不能通过设置优先级来确保高优先级的线程一定会先执行。
  • Java
  • JavaScript读取classpath资源
    目录