1.继承Thread类
步骤:
1.创建一个Thread类的子类。
2.重写Thread类中的run()方法。
3.创建Thread类子类的对象。
4.子类对象调用start()方法,开启新的线程。
public class MyThread extends Thread{//1.创建一个Thread类的子类。
public class GetName {
public static void main(String[] args) {
MyThread myThread = new MyThread();//3.创建Thread类子类的对象。
myThread.start();//子类对象调用start()方法,开启新的线程。
//没有继承Thread类,只能通过currentThread来获取当前的主线程名称
String name = currentThread().getName();
System.out.println("*main--" + name);
}
}
2.实现Runnable接口
步骤:
1.定义一个Runnable接口的实现类,并重写run()方法。
2.创建Runnable接口实现类的对象。
3.将接口实现类对象作为target来创建Thread对象。
4.Thread对象调用start()方法。
public class MyRunableImpl implements Runnable{//1.定义一个Runnable接口的实现类,并重写run()方法。
public class Application {
public static void main(String[] args) {
//定义一个Runnable
MyRunableImpl myRunable = new MyRunableImpl();//2.创建Runnable接口实现类的对象。
Thread thread = new Thread(myRunable);//3.将接口实现类对象作为target来创建Thread对象。
thread.start();//4.Thread对象调用start()方法。
}
}
第二种方法的好处
1.避免继承带来的局限性
线程池
JVM根据用户参数创建一定数量的线程,放进队列中。在线程创建以后启动这些任务。当线程数量多与任务,多出的线程会在队列中等候。相反,当用户创建的线程少于任务时,任务会在等候。当有任务执行完毕,线程回归线程池,线程调度器发现可用线程,从而会从取出任务执行。
步骤:
1.使用线程池的工厂类Executors里面的提供的静态方法,newFixedThreadPool。生产指定数量的线程。
2.创建Runnable接口的实现类,重写run()方法。
3.调用ExecutorService中的submit方法开启线程,需要传递Runnable接口实现类的对象。
ExecutorService threadPool = Executors.newFixedThreadPool(2);//1.使用线程池的工厂类Executors里面的提供的静态方法,newFixedThreadPool。生产指定数量的线程。
threadPool.submit(impl);//调用ExecutorService中的submit方法开启线程,需要传递Runnable接口实现类的对象。