方式一:继承Thread类
1、定义一个类继承Thread类
2、重写run方法
3、创建Thread的子类对象
4、调用start方法,开启线程并让线程执行
// 1 定义一个类继承Thread。
class MyThread extends Thread {
// 2 重写run方法。
@Override
public void run() {
for (int i = 0; i < 50; i++) {
System.out.println("MyThread " + i);
}
}
}
方式二:实现Runnable接口
1、定义一个类实现Runnable接口
2、覆盖接口中的run方法
3、创建Runnable实现类对象
4、创建Thread类的对象,将Runnable实现类对象作为参数传递给Thread的构造函数
5、调用Thread类的start方法开启线程
public class Demo07 {
public static void main(String[] args) {
// 3.创建Runnable实现类对象
MyRunnable mr = new MyRunnable();
// 4.创建Thread类的对象,将Runnable实现类对象作为参数传递给Thread类的构造函数。
Thread t1 = new Thread(mr);
// 5.调用Thread类的start方法开启线程。
t1.start();
String name = Thread.currentThread().getName();
for (int i = 0; i < 50; i++) {
System.out.println(name + " -- " + i);
}
}
}
// 1.定义类实现Runnable接口
class MyRunnable implements Runnable {
// 2.覆盖接口中的run方法。
@Override
public void run() {
// 这个方法中的代码会在新的线程中执行
String name = Thread.currentThread().getName();
for (int i = 0; i < 50; i++) {
System.out.println(name + " -- " + i);
}
}
}
方式三:Callable接口
与Runnable接口相似,用来指定线程的任务。其中的call()方法,用来返回线程任务执行完毕后的结果。
Executor:线程池对象
public static ExecutorService newFixedThreadPool(int nThreads);返回线程池对象。
ExecutorService:线程池类。
<T>Future<T> submit(Callable<T> task);获取线程池中的某一个线程对象,并执行线程中的call()方法。
Future接口:用来记录线程任务执行完毕后产生的结果,线程池创建与使用。
public class Demo11 {
public static void main(String[] args) {
// 创建线程池
ExecutorService poll = Executors.newFixedThreadPool(5);
// 执行任务
poll.submit(new MyCall());
// 执行任务
poll.submit(new MyCall());
}
}
class MyCall implements Callable {
@Override
public Object call() throws Exception {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + " , " + i);
}
return null;
}
}