多线程创建方式
1、继承 Thread 类 重写 run 方法
2、实现 Runnable 接口,重写 run 方法
3、使用匿名内部类方式
使用继承 Thread 类还是使用实现 Runnable 接口好?
使用实现实现 Runnable 接口好,原因实现了接口还可以继续继承,继承了类不能再继承。
启动线程是使用调用 start 方法还是 run 方法?
开始执行线程 注意 开启线程不是调用 run 方法,而是 start 方法
调用 run 只是调用实例方法。
常用线程api方法 | |
start() | 启动线程 |
currentThread() | 获取当前线程对象 |
getID() | 获取当前线程ID Thread-编号 该编号从0开始 |
getName() | 获取当前线程名称 |
sleep(long mill) | 休眠线程 |
Stop() | 停止线程 |
常用线程构造函数 | |
Thread() | 分配一个新的 Thread 对象 |
Thread(String name) | 分配一个新的 Thread对象,具有指定的 name正如其名。 |
Thread(Runable r) | 分配一个新的 Thread对象 |
Thread(Runable r, String name) | 分配一个新的 Thread对象 |
多线程运行状态
(一)新建状态
当用 new 操作符创建一个线程时, 例如 new Thread(r),线程还没有开始运行,此时线程处在新建状态。 当一个线程处于新生状态时,程序还没有开始运行线程中的代码
(二)就绪状态
一个新创建的线程并不自动开始运行,要执行线程,必须调用线程的 start()方法。当线程对象调用 start()方法即启动了线程,start()方法创建线程运行的系统资源,并调度线程运行 run()方法。当 start()方法返回后,线程就处于就绪状态。
处于就绪状态的线程并不一定立即运行 run()方法,线程还必须同其他线程竞争 CPU 时间,只有获得 CPU 时间才可以运行线程。因为在单 CPU 的计算机系统中,不可能同时运行多个线程,一个时刻仅有一个线程处于运行状态。因此此时可能有多个线程处于就绪状态。对多个处于就绪状态的线程是由 Java 运行时系统的线程调度程序(thread scheduler)来调度的。
(三)运行状态
当线程获得 CPU 时间后,它才进入运行状态,真正开始执行 run()方法.
(四)阻塞状态
线程运行过程中,可能由于各种原因进入阻塞状态:
1> 线程通过调用 sleep 方法进入睡眠状态;
2> 线程调用一个在 I/O 上被阻塞的操作,即该操作在输入输出操作完成之前不会返回到它的调用者;
3> 线程试图得到一个锁,而该锁正被其他线程持有;
4> 线程在等待某个触发条件;
(五)死亡状态
有两个原因会导致线程死亡:
1>run 方法正常退出而自然死亡,
2> 一个未捕获的异常终止了 run 方法而使线程猝死。
为了确定线程在当前是否存活着(就是要么是可运行的,要么是被阻塞了),需要使用 isAlive 方法。如果是可运行或被阻塞,这个方法返回 true; 如果线程仍旧是 new 状态且不是可运行的, 或者线程死亡了,则返回 false.
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于