方法名 说明
void run() 在线程开启后,此方法将被调用执行
void start() 使此线程开始执行,Java虚拟机会调用run方法()
实现步骤
定义一个类MyThread继承Thread类
在MyThread类中重写run()方法
创建MyThread类的对象
启动线程
代码演示
两个小问题
为什么要重写run()方法?
因为run()是用来封装被线程执行的代码
run()方法和start()方法的区别?
run():封装线程执行的代码,直接调用,相当于普通方法的调用
start():启动线程;然后由JVM调用此线程的run()方法
1.5实现多线程方式二:实现Runnable接口【应用】
Thread构造方法
publicclassMyThreadextendsThread{
@Override
publicvoidrun(){
for(inti=0;i<100;i++){
System.out.println(i);
}
}
}
publicclassMyThreadDemo{
publicstaticvoidmain(String[]args){
MyThreadmy1=newMyThread();
MyThreadmy2=newMyThread();
//my1.run();
//my2.run();
//voidstart()导致此线程开始执行;Java虚拟机调用此线程的run方法
my1.start();
my2.start();
}
}
方法名 说明
Thread(Runnable target) 分配一个新的Thread对象
Thread(Runnable target, String name) 分配一个新的Thread对象
实现步骤
定义一个类MyRunnable实现Runnable接口
在MyRunnable类中重写run()方法
创建MyRunnable类的对象
创建Thread类的对象,把MyRunnable对象作为构造方法的参数
启动线程
代码演示
1.6实现多线程方式三: 实现Callable接口【应用】
方法介绍
publicclassMyRunnableimplementsRunnable{
@Override
publicvoidrun(){
for(inti=0;i<100;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
publicclassMyRunnableDemo{
publicstaticvoidmain(String[]args){
//创建MyRunnable类的对象
MyRunnablemy=newMyRunnable();
//创建Thread类的对象,把MyRunnable对象作为构造方法的参数
//Thread(Runnabletarget)
//Threadt1=newThread(my);
//Threadt2=newThread(my);
//Thread(Runnabletarget,Stringname)
Threadt1=newThread(my,"坦克");
Threadt2=newThread(my,"飞机");
//启动线程
t1.start();
t2.start();
}
}
方法名 说明
V call() 计算结果,如果无法计算结果,则抛出一个异常
FutureTask(Callable callable) 创建一个 FutureTask,一旦运行就执行给定的 Callable
V get() 如有必要,等待计算完成,然后获取其结果
实现步骤
定义一个类MyCallable实现Callable接口
在MyCallable类中重写call()方法
创建MyCallable类的对象
创建Future的实现类FutureTask对象,把MyCallable对象作为构造方法的参数
创建Thread类的对象,把FutureTask对象作为构造方法的参数
启动线程
再调用get方法,就可以获取线程结束之后的结果。
代码演示
publicclassMyCallableimplementsCallable<String>{
@Override
publicStringcall()throwsException{
for(inti=0;i<100;i++){
System.out.println("跟女孩表白"+i);
}
//返回值就表示线程运行完毕之后的结果
return"答应";
}
}
publicclassDemo{
publicstaticvoidmain(String[]args)throwsExecutionException,InterruptedException
{
//线程开启之后需要执行里面的call方法
MyCallablemc=newMyCallable();
//Threadt1=newThread(mc);
//可以获取线程执行完毕之后的结果.也可以作为参数传递给Thread对象
FutureTask<String>ft=newFutureTask<>(mc);
//创建线程对象
Threadt1=newThread(ft);
Strings=ft.get();
//开启线程
t1.start();
//Strings=ft.get();
System.out.println(s);
}