一、继承Thread类的方式实现
Thread类 实现了 Runnable接口,Runnable接口中定义了run()方法;Thread类相当于实现了接口中的run()方法;当我们通过自定义类继承Thread类方式创建线程时,重写了Thread类中继承的run()方法,方法体中的内容即为多线程要执行的代码。
public class MyThread extends Thread{
@Override
public void run() {
//书写线程要执行的代码
for (int i = 0; i < 100; i++) {
System.out.println(getName()+": hello");
}
}
}
创建线程对象,并启动线程测试
MyThread t1 = new MyThread();
MyThread t2 = new MyThread();
//设置线程名称
t1.setName("线程1");
t2.setName("线程2");
//开启线程
t1.start();
t2.start();
二、实现Runnable接口
自定义一个类实现Runnable接口方式创建线程,实现Runnable接口中的run()方法,方法体内的内容即为多线程要执行的内容。
public class MyRun implements Runnable{
@Override
public void run() {
//书写线程要执行的代码
for (int i = 0; i < 100; i++) {
//获取当前线程的对象
Thread t = Thread.currentThread();
String threadName = t.getName();
System.out.println(threadName+"HelloWorld");
}
}
}
创建自定义类的对象,创建线程对象、开启线程
//创建MyRun对象 表示多线程要执行的任务
MyRun myRun = new MyRun();
//创建线程对象
Thread t1 = new Thread(myRun);
Thread t2 = new Thread(myRun);
//给线程设置名字
t1.setName("线程1:");
t2.setName("线程2:");
//开启线程
t1.start();
t2.start();
三、实现callable接口
Callable<V>接口,可以获取对线程的运行结果;实现Callable<V>,实现接口中的call()方法,call()方法有返回值,表示线程执行的结果,返回值类型跟泛型<V>要一致;自定义一个类实现Callable<V>接口,实现call()方法,方法体中即为多线程要执行的代码,并且有返回值。
public class MyCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
//求1~100的和
int sum = 0;
for (int i = 0; i <= 100; i++) {
sum = sum + i;
}
return sum;
}
}
利用Future<V>接口的作用管理多线程的运行结果,V--此 Future 的 get 方法所返回的结果类型;
Future接口没法直接创建对象,可以通过实现类FutureTask创建对象;
FutureTask构造方法:
FutureTask(Callable<V> callable)
FutureTask(Runnable runnable, V result)
FutureTask类的get方法说明:
get()
如有必要,等待计算完成,然后获取其结果。
//创建MyCallable对象
MyCallable mc = new MyCallable();
//FutureTask类实现了Runnable接口
FutureTask<Integer> ft = new FutureTask<>(mc);
//创建Thread对象,并启动
Thread t1 = new Thread(ft);
t1.start();
//获取多线程的运行结果
Integer result = ft.get();
System.out.println("------------"+result);