线程–< Thread >
Thread是一个线程类
线程之间互相独立运行,在宏观上看,线程在同时运行,在微观上看,线程是线程一次只有一个能运行
实际上,线程只有在获取到资源(cpu)才能运行,每次cpu只运行一个线程,但是cpu处理速度非常快,所以宏观上
看(在人看来),线程在同时运行
多个线程同时启动,它们的执行完全随机,由cpu决定,线程 run() 方法中的代码运行到什么地方也是完全
随机,可能一个线程运行到一半,cpu就去运行其它线程了
每次线程运行都会有一个时间片,时间运行完了不管线程内代码执行完了没有,都切换到下一个线程
运行谁系统调度说了算
线程创建方法一
想要使用线程需要自定义类之后继承 <Thread>类,重写run()方法,线程实际执行的是run()方法里的内容
public class Demo01 extends Thread{
@Override
public void run() {
}
}
线程创建方法二
自定义类实现 <Runnable>接口,重写run方法
在创建线程时,将自定义类添加到线程中,线程实际执行的是run()方法里的内容
线程创建方法三
自定义类实现 <Callable>接口,重写call方法
在创建线程时,将自定义类添加到线程中,线程实际执行的是call()方法里的内容
此方法有返回值
public class Demo02 implements Runnable{
@Override
public void run() {
}
}
1.自定义类继承Thread使用
Main
public class Main {
public static void main(String[] args) {
MyThread01 myThread01 = new MyThread01();
myThread01.start();
}
}
//线程类
class MyThread01 extends Thread{
@Override
public void run() {
System.out.println("1");
System.out.println("2");
System.out.println("3");
}
}
输出结果
1
2
3
2.实现接口方法类, < Runnable >接口
public class Main {
public static void main(String[] args) {
//创建线程时把 方法类 放进去
Thread thread = new Thread(new Task());
thread.start();
}
}
//实现接口方法类
class Task implements Runnable{
@Override
public void run() {
System.out.println("1");
System.out.println("2");
System.out.println("3");
}
}
输出结果
1
2
3
3.同时启动两根线程
运行哪根线程完全随机,可能运行线程a到一半就去运行线程b了,也可能运行完线程a再去线程b
public class Main {
public static void main(String[] args) {
//创建线程
MyThread01 myThread01 = new MyThread01();
Thread thread = new Thread(new Task());
//启动线程一
myThread01.start();
//启动线程二
thread.start();
}
}
class MyThread01 extends Thread{
@Override
public void run() {
System.out.println("线程1");
System.out.println("线程1");
System.out.println("线程1");
}
}
class Task implements Runnable{
@Override
public void run() {
System.out.println("线程2");
System.out.println("线程2");
System.out.println("线程2");
}
}
输出结果
结果随机,不一定
线程1
线程1
线程2
线程2
线程2
线程1