缺点:Java单继承特性,如果已经继承其他类,则不能再继承Thread类。
/** * 创建多线程:继承Thread 重写run() */ public class ThreadTest extends Thread{ @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println("i:"+i); } } } public class TestMain { public static void main(String[] args) { ThreadTest ts=new ThreadTest(); //创建子类对象 ts.start();//调用start() } } 通过实现Runnable接口 实现多线程。 实现Runnable接口重写Run()方法使用Start()方法优点:可以同时实现继承。
//实现了java.lang.Runnable接口 public class MyRunnable implements Runnable { public void run(){ System.out.println("MyRunnable running"); } } //为了使线程能够执行run()方法,需要在Thread类的构造函数中传入 MyRunnable的实例对象 Thread thread = new Thread(new MyRunnable()); thread.start(); //当创建一个线程的时候,可以给线程起一个名字. MyRunnable runnable = new MyRunnable(); Thread thread = new Thread(runnable, "New Thread"); thread.start(); System.out.println(thread.getName()); //得到当前线程的引用 Thread.currentThread(); //得到当前线程的名字 String threadName = Thread.currentThread().getName(); //输出执行main()方法线程名字。这个线程JVM分配的。然后开启10个线程,命名为1~10。每个线程输出自己的名字后就退出。 public class ThreadExample { public static void main(String[] args){ System.out.println(Thread.currentThread().getName()); for(int i=0; i<10; i++){ new Thread("" + i){ public void run(){ System.out.println("Thread: " + getName() + "running"); } }.start(); } } }通过实现callable接口 实现多线程 1. 创建callable实现类+重写call 2. 借助执行调度服务 ExecutorService 获取Future对象 ExecutorService ser=Executors.newFixedThreadPool(2); Future future =ser.submit(task:实现类对象);、 3. 获取值 future.get(); 4. 停止服务 ser.shutdownNow(); 使用callable 创建线程比较繁琐。
Runnable和Callable的区别是:
Callable规定的方法是call(),Runnable规定的方法是run()。其中Runnable可以提交给Thread来包装下,直接启动一个线程来执行,而Callable则一般都是提交给ExecuteService来执行。Callable的任务执行后可返回值,而Runnable的任务是不能返回值得call方法可以抛出异常,run方法不可以运行Callable任务可以拿到一个Future对象,c表示异步计算的结果。Runnable和Callable的区别 参考:https://blog.csdn.net/qq_27258799/article/details/51451143