线程实现的四种⽅式
实现线程有四种⽅式
分别是:
1. ⽅式⼀:继承Thread类,重写run⽅法
2. ⽅式⼆:实现Runnable接⼝,实现run⽅法
3. ⽅式三:实现Callnable接⼝,实现call⽅法
4. ⽅式四:利⽤ExecutorService线程池的⽅式创建线程
下⾯就来⼀⼀介绍:
⽅式⼀:继承Thread类,重写run⽅法
实现⽅式如下:
package com.lxk.thread1;
java线程池创建的四种public class TestThread extends Thread{
@Override
public void run() {
System.out.println("测试线程!");
}
public static void main(String[] args) {
TestThread t1=new TestThread();
TestThread t2=new TestThread();
t1.start();
t2.start();
}
}
⽅式⼆:实现Runnable接⼝,实现run⽅法
实现Runnable接⼝,实现之后还需要⽤Thread类进⾏封装
具体实现⽅式如下:
package com.lxk.thread2;
public class TestThread implements Runnable{
@Override
public void run() {
System.out.println("测试线程!");
}
public static void main(String[] args) {
TestThread r=new TestThread();
Thread t1=new Thread(r);
Thread t2=new Thread(r);
t1.start();
t2.start();
}
}
⽅式三:实现Callnable接⼝,实现call⽅法
Callnable接⼝中有声明了⼀个⽅法call⽅法,该⽅法的返回类型不是void,⽽是Callnable接⼝的类泛型T
因此它是有返回值的,可以获取到线程执⾏体的返回值
线程类需要实现Callnable接⼝,在使⽤的时候需要先⽤FutureTask类封装线程类,然后⽤Thread类继续封装FutureTask类,然后调⽤start⽅法.
具体实现如下:
package com.lxk.thread3;
import urrent.Callable;
import urrent.FutureTask;
public class MyThread implements Callable<Integer>{
int i=0;
@Override
public Integer call() throws Exception {
i++;
return i;
}
public static void main(String[] args) throws Exception {
Callable mt=new MyThread();
FutureTask<Integer> ft=new FutureTask<Integer>(mt);
Thread t=new Thread(ft);
t.start();
Integer integer = ft.get();//获取到线程执⾏体的返回值
System.out.println(integer);
}
}
⽅式四:利⽤ExecutorService线程池的⽅式创建线程
该⽅法是jdk1.5之后才出现的,利⽤ExecutorService⼀次性创建很多个线程,在需要该线程的时候直接从该线程池中拿取就可以了.(池的概念可以类⽐jdbc连接池)
具体实现如下:
package com.lxk.thread4;
import urrent.ExecutorService;
import urrent.Executors;
public class MyThread implements Runnable{
public static void main(String[] args) throws Exception {
ExecutorService wFixedThreadPool(10);
for (int i = 0; i < 10; i++) {
Thread t=new Thread(new MyThread());
//执⾏线程体,那个都可以
// t.start();
/
/ e.execute(t);
}
e.shutdown();
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("执⾏线程!");
}
}
总结:
⽅式⼀和⽅式⼆都是没有返回值的,实际使⽤的时候推荐使⽤⽅式⼆,因为java是⾯向接⼝编程的,java是单继承多实现,⾯向接⼝编程可以更好的对类进⾏扩展,因此推荐使⽤⽅式⼆
⽅式三是由返回值的,如果需要获取到线程执⾏体的返回值推荐使⽤⽅式三
⽅式四是线程池的思想,池⾥⾯既可以放⽅式⼀和⽅式⼆创建的线程也可以放⽅式三创建的线程.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论