方式一:继承父类thread
1、定义一个子类,继承父类thread
2、重写父类的run方法
3、创建线程类的“对象”
4、启动线程
package week14;public class ThreadDemo {public static void main(String[] args) {//3、创建线程类的“对象”Thread t1 = new MyThread4();//4、启动线程t1.start();for(int i=0;i<10;i++){System.out.println("main");}}
}
//1、定义一个子类,继承父类thread
class MyThread4 extends Thread{//2、重写父类的run方法public void run(){for(int i=0;i<10;i++){System.out.println("mythread4");}}
}
继承thread类的缺点:单继承的局限性
注意事项:
1、启动线程必须是调用start方法,不是调用run方法。
(1)直接调用run方法会当成普通方法执行,此时相当于还是单线程执行。
(2)只有调用start方法才是启动一个新的线程执行。
2、不要把主线程任务放在启动子线程之前。 - 这样主线程一直是先跑完的,相当于还是一个单线程的效果了。
代码:
方式二:Runnable接口
代码
package week14;public class RunnableDemo {public static void main(String[] args) {//3.创建一个线程任类的对象Runnable r = new MyRunnable2();//4.创建一个线程对象Thread t1 = new Thread(r);//5.启动线程t1.start();for (int i = 0; i <3 ; i++) {System.out.println("main线程");}}
}
//1.创建线程任务类,实现Runnable 接口
class MyRunnable2 implements Runnable{
//2.重写run方法@Overridepublic void run(){for(int i=0;i<3;i++){System.out.println(" runnable线程");}}
}
匿名内部类写法:
方式三:利用Callable接口
1、创建任务对象
(1) 定义一个类实现Callable接口,重写call方法,封装要做的事情,和要返回的数据。
(2) 把Callable类型的对象封装成FutureTask(线程任务对象)。
2、把线程任务对象交给Thread对象。
3、调用Thread对象的start方法启动线程。
4、线程执行完毕后,通过FutureTask对象的的get方法去获取线程任务执行的结果。