**
一.认识什么是线程/进程:
线程:并发完成的每一件事情(在Java中)
进程:每个独立执行的程序(Windows操作系统以此为单位)
二.实现线程的两种方法:
(1)继承Thred类
创建一个新的线程:
public class ThreadTest extends Thread{
}
关于run()方法:
老师刚刚将run()方法的时候我不太理解什么是run()方法,通过看了书以后理解了一些,总结如下:
- 继承Thread的类要在自身类中重写run()方法覆盖基类的run()
- 要将实现该线程功能的代码写进run()中
- 调用run()要用start(),并不是直接调用run()【这点很重要,很多初用者不太熟悉】
调用方法:
public static void main(String[] args){
new ThreadTest().start();
}
这里注意:
- 如果start()方法调用了一个已经启动的线程的话,系统会抛出IllegaThreadStateException异常
- 主方法为调用start()前,Thread对象仅为实例,并非真正的线程
例:
public class ThreadTest extends Thread{
public void run() {
for(int i=0;i<5;i++) {
System.out.println(i);
}
}
public static void main(String[] args) {
new ThreadTest().start();
}
}
运行结果
0
1
2
3
4
(2)实现Runnable接口
根据我所理解的知识,其实Runnable接口其实就是:当你的类既要继承其他类,又要实现多线程的时候,可以使用Runnable接口实现。
接口定义:
public class ThreadTest extends Object implements Runnable{
}
在API手册中可以发现
但是Runnable接口与Thread对象最好要在一起。
要在实现接口的时候创建一个Thread对象,并且将他俩相关联。
这是API手册的构造方法摘要,定义时可以参考这个。
综上所述:其实Runnable接口要是想实现线程必须经过Thread,然后调用start()方法启动线程。
如图所示:
三.线程的生命周期
以上是线程生命周期的各种状态 可以参考
四.具体操作方法
1.线程的休眠
sleep语法:
try{
//线程休眠2s
Thread.sleep(2000); //2000ms=2s
}catch{
e.printStackTrace();
}
2.线程的加入
要点:当某线程B使用join()方法加入线程A中时,线程A会先让线程B执行完毕后再继续执行。
3.线程的中断
方法:在run()中使用无限循环的形式,然后使用一个布尔型标记控制循环的停止
public class interruptedTest implements Runnable{
private boolean count=false;
public void run(){
while (true){
if(count){
break;
}
}
}
public static void main(String[] args){
interruptedTest.start();
}
}
书写代码时可能遇到的问题:
- 使用sleep()或者wait()进入了就绪状态,可以使用Thread类interrupt()方法使线程离开run()方法
4.线程的礼让
yield()方法使同样具有优先级的线程有进入可执行状态的机会