java中下面哪个能创建并启动线程()
public class MyRunnable implements Runnable { public void run() { //some code here } }
Thread thread = new Thread(new MyRunnable()); |
thread.start(); |
多线程的实现的两种方法我已总结:
http://blog.csdn.net/dawn_after_dark/article/details/74054652
为什么C对呢?JDk源码:
public void run() {
if (target != null) { //会判断有无Runnable参数
target.run();
}
}
java多线程创建的5种常见方法:
1、继承Thread类
继承Thread并重写run方法,并调用start方法
public class ThreadDemo extends Thread { @Override public void run() { while (true) { System.out.println(Thread.currentThread().getName() + " is running ... "); // 打印当前线程的名字 } } public static void main(String[] args) { ThreadDemo td = new ThreadDemo(); td.start(); // 启动线程 } }
2、实现Runnable接口
实现Runnable接口,并用其初始化Thread,然后创建Thread实例,并调用start方法。
public class ThreadTarget implements Runnable { @Override public void run() { System.out.println(Thread.currentThread().getName() + " is running .. "); } } //----------------分割线 public class Main { public static void main(String[] args) { ThreadTarget tt = new ThreadTarget(); // 实例化线程任务类 Thread t = new Thread(tt); // 创建线程对象,并将线程任务类作为构造方法参数传入 t.start(); // 启动线程 } }
3、定时器
定时器可以说是一种基于线程的一个工具类。可以定时的来执行某个任务。
在2020年3月19日晚上10点执行任务。
public class TimerDemo { private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); public static void main(String[] args) throws Exception { Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { System.out.println("定时任务执行了...."); } }, format.parse("2020-3-19 22:00:00")); } }
4、继承Callable接口
继承Thread类还是实现Runnable接口的方法有两个问题,第一个是无法抛出更多的异常,第二个是线程执行完毕之后并无法获得线程的返回值。实现Callable的方法可以爬出异常,也可以带返回值。
1. 创建一个类实现Callable接口,实现call方法。这个接口类似于Runnable接口,但比Runnable接口更加强大,增加了异常和返回值。 2. 创建一个FutureTask,指定Callable对象,做为线程任务。 3. 创建线程,指定线程任务。 4. 启动线程
代码如下:
public class CallableTest { public static void main(String[] args) throws Exception { Callable<Integer> call = new Callable<Integer>() { //这里使用匿名内部类的方式来重写call()方法 @Override public Integer call() throws Exception { System.out.println("thread start .. "); Thread.sleep(2000); return 1; } }; //创建一个FutureTask,指定Callable对象,做为线程任务。 FutureTask<Integer> task = new FutureTask<Integer>(call); Thread t = new Thread(task); t.start(); task.get();//获取返回值,get是个阻塞方法,只有获取到返回值才会放行线程 System.out.println("do other thing .. "); System.out.println("拿到线程的执行结果 : " + task.get()); } }
5、基于线程池的方法
如下:
public class ThreadPoolDemo { public static void main(String[] args) { // 创建线程池 ExecutorService threadPool = Executors.newFixedThreadPool(10);//最多可以有10个线程 while(true) { threadPool.execute(new Runnable() { // 提交多个线程任务,并执行(匿名内部类的方式) @Override public void run() { System.out.println(Thread.currentThread().getName() + " is running .."); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } } }); } } }
Thread(Runnable target, String name)
Thread(ThreadGroup group, Runnable target)
Thread(ThreadGroup group, Runnable target, String name)
Thread(ThreadGroup group, Runnable target, String name, long stackSize)