继承Thread类,重写run方法--->重点掌握
实现Runnable接口,重写run方法--->重点掌握
实现Callable接口,重写call方法--->JUC并发包下的
少用继承,多用实现。因为Java当中是只有单继承--->实现了Runable接口只要实现了就具备了多线程的能力
继承了Object类,实现了Runnable接口
Runnable类特点:
由任何类实现、实例将由线程执行
必须定义一个无参数的方法,run--->必须重写run方法
每个线程都有优先权。 具有较高优先级的线程优先于优先级较低的线程执行。
优先级较高的不一定代表一定会被执行,只是优先级较高的cpu可能分配的概率会大一些
线程分类
用户线程--->程序必须等待它执行完毕后才能停下
守护线程--->可以不必等待线程执行完毕就可以停止
默认情况下每个线程都是用户线程
将一个类声明为Thread的子类,这个子类应该重写成run类的方法Thread。然后可以分配并启动子类的实例。
class PrimeThread extends Thread{ long minPrime; PrimeThread(long minPrime){ this.minPrime = minPrime; } /*必须重写run方法,因为Threa类也实现了Runnable接口*/ public void run(){ //方法体,如果没有就是一个空线程 ... } }
创建好了线程以后需要去启动它:
/*通过构造器创建对象,调用提供好的start方法*/ PrimeThread p = new PrimeThread(143); p.start(); //strat方法是交给cpu什么时候去调用。Thread类写好了这个方法
第二个是声明一个实现Runnable接口的类。实现run方法
class PrimeThread implements Runnable{ long minPrime; PrimeThread(long minPrime){ this.minPrime = minPrime; } /*必须重写run方法,因为Threa类也实现了Runnable接口*/ public void run(){ //方法体,如果没有就是一个空线程 ... } }
因为只是实现了接口,所以没有Thread类当中的start方法直接交给cpu去安排,所以要new一个Thread对象
PrimeRun p = new PrimeRun(143); //真实对象 new Thread(p).start(); //Thread对象称为目标对象
Thread的构造器够线程组的构造器
start方法
run方法
package iostudy.thread; /** * 创建线程: * 1、通过继承Thread类,重写run方法创建 * 2、创建子类对象 + start方法启动 */ public class StartThread extends Thread{ /** * 线程入口点 */ @Override public void run(){ super.run(); /* 线程入口点进入了之后称为线程体 写代码 写方法的调用 */ for (int i = 0; i < 20; i++){ System.out.println("一边吃饭"); /*这是一个线程*/ } } public static void main(String[] args) { /*启动线程的方法*/ //创建子类对象--->子类是指继承了Thread类的子类 StartThread st = new StartThread(); //从main方法进入,创建一个对象 /*使用父类的start方法*/ st.start(); //调用了start方法,开启一个线程交给cpu去调用。这个程序会直接往下运行不会等待start方法执行完毕 /*这个线程一启动直接有了*/ for (int i = 0; i < 20; i++){ System.out.println("一边喝水"); } } }