Thread基础-创建线程的方式
Java线程创建的几种简单方式
1. extends Thread类
public class ThreadDemo extends Thread{
@Override
public void run() {
System.out.println("this is a Thread class run method.");
}
}
2. implements Runnable接口
public class RunnableDemo implements Runnable{
@Override
public void run() {
System.out.println("this is a runnable interface.");
}
}
提个小问题:如果继承了Thread类重写了run方法又实现了Runnable接口,那么执行的是那个run方法呢?
public class MyRunnable implements Runnable{
@Override
public void run() {
System.out.println("runnable method");
}
/* main() */
public static void main(String[] args) {
MyRunnable mr = new MyRunnable();
new Thread(mr) {
@Override
public void run() {
System.out.println("Thread method");
}
}.start();
}
}
输出结果为:Thread method
Thread中的run方法代码为
/* What will be run. */
private Runnable target;
/**
* If this thread was constructed using a separate
* <code>Runnable</code> run object, then that
* <code>Runnable</code> object's <code>run</code> method is called;
* otherwise, this method does nothing and returns.
* <p>
* Subclasses of <code>Thread</code> should override this method.
*
* @see #start()
* @see #stop()
* @see #Thread(ThreadGroup, Runnable, String)
*/
@Override
public void run() {
if (target != null) {
target.run();
}
}
传入Thread的Runnable会被保存为"target"对象,调用时会通过Thread中的run方法判断执行,但是在上面的代码中重写了Thread.run方法。所以结果很明显...
3. 线程池创建线程
public static void main(String[] args) {
ExecutorService es = Executors.newFixedThreadPool(3);
//
for (int i = 0; i < 10; i++) {
es.execute(() -> {
System.out.println(Thread.currentThread().getName());
});
}
}
4. FuterTask & Callable 可获取线程执行结果
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class MyCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
int v = 0;
int random = new Random().nextInt(200);
System.out.println("random num:" + random);
for (int i = 0; i < random; i++) {
System.out.println(Thread.currentThread().getName() + "----" + i);
v += i;
}
return v;
}
public static void main(String[] args) {
MyCallable mc = new MyCallable();
FutureTask<Integer> ft = new FutureTask<Integer>(mc);
for (int i = 0; i < 20; i++) {
new Thread(ft, "tn--" + i).start();
}
// get result
try {
Integer result = ft.get();
System.out.println(result);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}

浙公网安备 33010602011771号