多线程
并发:指多个事件在同一时间段内发生
并行:是指多个时间在同一时刻方法
线程的调度
创建线程类
使用场景:
我们要是想要实现多线程程序,就必须创建一个继承Thread类的子类
实现步骤:
1.创建一个Thread类的子类
2.在Thread类的子类中重写Thread类中的run方法,设置线程任务(开启线程后要做什么)
3.创建Thread类的子类对象
4.调用Tread类中的方法start方法,开始新的线程,执行run方法
创建一个子类MyThread重写run方法
public class MyThread extends Thread{
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println("run"+i);
}
}
}
主程序
public class t1 {
public static void main(String[] args) throws RegisterException {
MyThread mt = new MyThread();
mt.start();
for (int i = 0; i < 20; i++) {
System.out.println("main"+i);
}
}
}
Thread类中的常用方法
创建一个继承Thread类的子类
public class MyThread extends Thread{
@Override
public void run() {
//获取线程名称
String name = getName();
System.out.println(name);
}
}
主程序
public class t1 {
public static void main(String[] args){
MyThread mt = new MyThread();
mt.start();//Thread-0
new MyThread().start();//Thread-1
System.out.println(Thread.currentThread().getName());//main
}
}
Thread类的sleep方法
public class t1 {
public static void main(String[] args){
//模拟秒表
for (int i = 0; i < 60; i++) {
System.out.println(i);
try {
Thread.sleep(1000);//毫秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
创建多线程的第二种方式:实现Runnable接口
实现步骤:
1.创建一个Runnable接口的实现类
2.在实现类中重写Runnable接口的run方法,设置线程任务
3.创建一个Runnable接口的实现类对象
4.创建Thread类对象,构造方法中传递Runnable接口的实现类对象
5.调用Thread类中的start方法,开启新的线程执行run方法
创建Runnable接口的实现类RunnableImple
public class RunnableImple implements Runnable {
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName()+i);
}
}
}
主程序
public class t1 {
public static void main(String[] args){
RunnableImple rn = new RunnableImple();
Thread th = new Thread(rn);
th.start();
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName()+i);
}
}
}
Thread和Runnable的区别
实现Runnable接口创建多线程的好处:
匿名内部类方式实现线程的创建
匿名:没有名字
内部类:写在其他类的内部的类
使用场景:
把子类继承父类,重写父类的方法,创建子类对象合一步完成
或者是把实现类现实接口,重写接口中的方法,已经创建实现类对象合成一步完成
public class t1 {
public static void main(String[] args){
//匿名内部类实现继承
new Thread(){
//重写run方法,设置线程任务
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName()+i);
}
}
}.start();
//匿名内部类实现接口
Runnable r = new Runnable(){
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName()+i);
}
}
};
new Thread(r).start();
//简化接口的方式
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName());
}
}
});
}
}