提示:除了Thread、Runnable之外,你还不知道的线程创建方式——线程池、Callable
一、Thread
1.线程创建步骤
- 创建类NumberThread,并继承Thread类:class NumberThread extends Thread{}
- 重写run()方法:public void run(){}
- 创建NumberThread对象:NumberThread num=new NumberThread()
- 启动程序:num.start()(start()方法会自动调用run()方法)
2.代码演示
package com.zcl.test;
class NumberThread extends Thread{
public void run(){
for(int i=0;i<100;i++){
if(i%2==0){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
}
public class ThreadMethodTest {
public static void main(String[] args) {
NumberThread h1=new NumberThread();
h1.start();
}
}
二、Runnable
1.线程创建步骤
- 创建Runnable接口的实现类:class NumberRunnable implements Runnable{}
- 重写run()方法:public void run(){}
- 创建NumberRunnable的对象:NumberRunnable num=new NumberRunnable()
- 创建Thread类的对象,并把num作为参数:Thread thread=new Thread(num)
- 启动线程:thread.start()
2.代码演示
class NumberRunnable implements Runnable{
public void run(){
for(int i=0;i<100;i++){
if(i%2==0){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
}
public class RunnableTest {
public static void main(String[] args) {
NumberRunnable num=new NumberRunnable();
Thread thread=new Thread(num);
thread.start()
}
}
三、Callable
1.线程创建步骤
- 创建Callable接口的实现类:class NumberCallable implements Callable{}
- 重写call()方法,可以有返回值:public Object call(){}
- 创建NumberCallable的对象:NumberCallable num=new NumberCallable()
- 创建FutureTask类的对象,并把num作为对象传递过去:(futureTask.get()获取返回值)
FutureTask futureTask= new FutureTask(num)
- 创建Thread类的对象,并把futureTask作为参数:Thread thread=new Thread(num)
- 启动线程:thread.start()
2.代码演示
class NumThread implements Callable{
public Object call() throws Exception{
int sum=0;
for(int i=1;i<=100;i++){
if(i%2==0){
System.out.println(i);
sum+=i;
}
}
return sum;
}
}
public class ThreadNew {
public static void main(String[] args) {
NumThread numThread=new NumThread();
FutureTask futureTask= new FutureTask(numThread);
new Thread(futureTask).start();
try {
//get()返回值即为FutureTask构造器参数Callable实现类重写的call()的返回值
Object sum=futureTask.get();
System.out.println("总和为:"+sum);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
四、线程池
1.线程创建步骤
- 提供指定线程数量的线程池:ExcutorService service=Excutors.newFixedThreadPool(n);
- 执行指定的线程的操作。需要提供实现Runnable接口或Callable接口实现类的对象: service.execute(new XxxRunnable()):适用于Runnable接口实现类的对象 service.submit(new XxxCallable()):适用于Callable接口实现类的对象
- 关闭连接池: service.shutdown();
2.代码演示
class NumberThread implements Runnable{
@Override
public void run() {
for(int i=0;i<=100;i++){
if(i%2==0){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
}
public class ThreadPool {
public static void main(String[] args) {
ExecutorService service=Executors.newFixedThreadPool(10);
service.execute(new NumberThread());//适用于Runnable
//service.submit();//适用于Callable
service.shutdown();
}
}