创建线程的方式
继承Thread类
- 定义子类继承Thread类。
- 子类中重写Thread类中的run方法。
- 创建Thread子类对象,即创建了线程对象。
- 调用线程对象start方法:启动线程,调用run方法。
run(),想要开启多线程中运行代码逻辑,就写到run()方法里面。
start()用来启动线程,本质上是从run开始的。
TestThread,java
/**
* 实现多线程
* @author jkjkjk
*
*/
public class TestThread extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("run了");
for(int i = 0; i<5;i++) {
System.out.println("runxxxx"+i);
}
}
}
Test.java
public class Test {
public static void main(String[] args) {
Thread t0 = new TestThread();//多态
t0.start();//启动线程,开始运行run里面的东西
System.out.println("-------------1");
System.out.println("-------------2");
System.out.println("-------------3");
}
}
运行结果:
-------------1
-------------2
run了
-------------3
runxxxx0
runxxxx1
runxxxx2
runxxxx3
runxxxx4
/**
* 多次运行这个main方法之后
* 我们发现main方法中打印的3行与开启线程运行run方法中的打印语句是混合起来
* 而且main方法中的打印与run方法中打印语句顺序是不固定的
* 为什么呢?
* main执行t0.start()方法开启多线程之后,就相当于在main方法之外开启一个支流
* 这个个时候t0.start()的之后的main方法的其他代码的运行就与run方法运行无关了
* 以当前代码为例
* t0.start()的之后的main方法的其他代码与run方法的代码并行运行
* 就像两条河流一样,各走各的
* 那么控制台输出的结果就是两条并行程序的运行结果总和,这个结果需要拆开成两部分看
* 就可以看到,各自是保持自己输出顺序
* 这个就是多线程的异步,这个异步相对于执行t0.start()的主程序来说的
* 简单来说开启了线程之后run方法中运行的代码主程序中t0.start()之后的程序是并行执行的,没先后关系,这个叫异步
*/
实现Runnable接口
1)定义子类,实现Runnable接口。
2)子类中重写Runnable接口中的run方法。
3)通过Thread类含参构造器创建线程对象。
4)将Runnable接口的子类对象作为实际参数传递给
Thread类的构造方法中。
5)调用Thread类的start方法:开启线程,调用
Runnable子类接口的run方法。
TestRunnable.java
public class TestRunnable implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(Thread.currentThread().getName() + "接口里面的run---");
}
}
Test1.java
public class Test1 {
public static void main(String[] args) {
// Thread t = new Thread(new TestRunnable());
// t.start();
Thread t1 = new Thread(new TestRunnable(), "t-1");//匿名对象
t1.start();
Thread t2 = new Thread(new TestRunnable(), "t-2");//
t2.start();
//和一种一样
Runnable r = new TestRunnable();
Thread t3 = new Thread(r, "t-3");//通过Thread类含参构造器创建线程对象
t3.start();
System.out.println("-------------1");
System.out.println("-------------2");
System.out.println("-------------3");
}
}
继承Thread: 线程代码存放Thread子类run方法中。重写run方法
实现Runnable:线程代码存在接口的子类的run方法。实现run方法
避免了单继承的局限性
多个线程可以共享同一个接口实现类的对象,非常适合多个相同线程来处理同一份资源
多线程程序的优点
提高应用程序的响应。对图形化界面更有意义,可增强用户体验。
提高计算机系统CPU的利用率
改善程序结构。将既长又复杂的进程分为多个线程,独立运行,利于理解和修改
Thread类的有关方法(1)
void start(): 启动线程,并执行对象的run()方法
run(): 线程在被调度时执行的操作
String getName(): 返回线程的名称
void setName(String name):设置该线程名称
static currentThread(): 返回当前线程
t0.setName(“线程t-0”);//设置线程的名称
t1.setName(“线程t-1”);//设置线程的名称
线程的生命周期: