publicclassThreadMethods{publicstaticvoidmain(String[] args){ThreadMethod1 t1=newThreadMethod1();
t1.setName("线程一");
t1.start();// 主线程命名Thread.currentThread().setName("主线程");for(int i =0; i <100; i++){if(i%2==0){System.out.println(Thread.currentThread().getName()+":"+i);}if(i==20){try{
t1.join();}catch(InterruptedException e){thrownewRuntimeException(e);}}}System.out.println(t1.isAlive());}}classThreadMethod1extendsThread{@Overridepublicvoidrun(){for(int i =0; i <100; i++){if(i%2==0){System.out.println(Thread.currentThread().getName()+":"+i);}try{Thread.sleep(1000);}catch(InterruptedException e){thrownewRuntimeException(e);}}}}
多线程创建
继承于Thread类
创建一个继承与Thread的子类
重写Thread类的run()方法
创建Thread类的子类的对象
通过此对象调用start()
不能直接调用run()方法
不可以让已经start()的线程再次执行
classMyThreadextendsThread{@Overridepublicvoidrun(){for(int i =0; i <100; i++){if(i%2==0){System.out.println(i);}}}}publicclassThreadTest{publicstaticvoidmain(String[] args){MyThread t1 =newMyThread();
t1.start();for(int i =0; i <100; i++){if(i%2==0){System.out.println(i+"****main****");}}}}
实现Runnable接口
创建一个实现了Runnable接口的类
实现类去实现Runnable中的抽象方法run()
创建实现类的对象
将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
通过Thread类调用start()
publicclassThreadRunnable{publicstaticvoidmain(String[] args){Runnable1 r1=newRunnable1();Thread t1=newThread(r1);
t1.setName("线程1");
t1.start();Thread t2=newThread(r1);
t2.setName("线程2");
t2.start();}}classRunnable1implementsRunnable{@Overridepublicvoidrun(){for(int i =0; i <100; i++){if(i%2==0){System.out.println(Thread.currentThread().getName()+":"+i);}}}}
Runnable接口优点
实现方式没有类的单继承性的局限性
实现方式更适合处理多个线程共享数据的情况
Callable接口
实现Callable的实现类
实现call()方法,把此线程需要执行的方法声明在call()中
创建Callable接口实现类的对象
将Callable接口实现类的对象作为参数传递到FutureTask对象中
将FutureTask的对象作为参数传递到Thread中,调用start()方法启动线程
获取Callable返回值
import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.FutureTask;publicclassCallableTest{publicstaticvoidmain(String[] args){
Test t1=newTest();
FutureTask futureTask =newFutureTask(t1);newThread(futureTask).start();try{
Object o1=futureTask.get();
System.out.println(o1);}catch(InterruptedException e){thrownewRuntimeException(e);}catch(ExecutionException e){thrownewRuntimeException(e);}}}classTestimplementsCallable{
@Override
public Object call() throws Exception {
int sum=0;for(int i =0; i <100; i++){if(i%2==0){
System.out.println(i);
sum+=i;}}return sum;}}
与Runnable接口相比优点
可以在run()方法中有返回值
可以抛出异常
支持泛型返回值
需要借组FultureTask类,比如获取返回结果
线程池
提前创好多个线程,放入线程池中,使用时直接获取,使用完放回池中
可以避免重复创建销毁,实现重复利用
提供指定数量线程池
执行指定线程操作,需要提供实现Runnable或者Callable接口实现类的对象
关闭线程池
importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;publicclassThreadPoll{publicstaticvoidmain(String[] args){ExecutorService service =Executors.newFixedThreadPool(10);NumThread1 n1=newNumThread1();NumThread2 n2=newNumThread2();
service.execute(n1);// 适合Runnable
service.execute(n2);// service.submit(); // 适合Callable// 关闭
service.shutdown();}}classNumThread1implementsRunnable{@Overridepublicvoidrun(){for(int i =0; i <100; i++){if(i%2==0){System.out.println(Thread.currentThread().getName()+"名字为"+i);}}}}classNumThread2implementsRunnable{@Overridepublicvoidrun(){for(int i =0; i <100; i++){if(i%2!=0){System.out.println(Thread.currentThread().getName()+"名字为"+i);}}}}