new Thread(new Runnable(){})
一、写法介绍
JAVA是面向对象的,也就是说,对于一个方法等,它需要什么类型的对象,只要传入就可以了。
像这里,Thread类的构造方法中,需要一个实现了Runnable接口的对象,而new就是生成了个Runnable接口下的一个实例对象。
同等与这种写法,实例化了一个Runnable接口子类的实例
Thread t=new Thread(new MyRunnable());public class MyRunnable implements Runnable{@Overridepublic void run() {//具体实现}}
看起来是直接new一个接口,实际上是匿名内部类
因为接口不能实例化,new Runnable()是一个实现接口Runnable的类的对象,后面的run方法是该类里实现的方法,这就是匿名内部类的写法
二、匿名内部类
匿名内部类也就是没有名字的内部类
正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写
但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口
这里正是实现Runnable接口的简化代码
那么这里用到的Runnable接口是什么?
三、多线程
Java中,线程创建有三种方法:
1. 实现Runnable接口的run方法
public class RunableTest{ //继承Thread类并重写run方法 public static class RunableTask implements Runnable{ @Override public void run(){ System.out.printlan('I am a child theread'); } } public static void mian(String[] args) throws InterruptedException{ //创建线程 RunableTask task = new RunableTask(); //启动线程 new Thread(task).start(); new Thread(task).start(); } } 12345678910111213141516171234567891011121314151617
2. 继承Thread类并重写run方法
public class ThreadTest{ //继承Thread类并重写run方法 public static class MyThread extends Thread{ @Override public void run(){ System.out.printlan('I am a child theread'); } } public static void mian(String[] args){ //创建线程 MyThread thread = new MyThread; //启动线程 thread.start(); } }
3. 使用FutureTask方式
public class FutureTest{ //创建任务类,类似Runnable public static class CallerTask implements Callable<String>{ @Override public String call() throws Exception{ return 'hello' } } public static void mian(String[] args) throws InterruptedException{ //创建异步任务 FutureTask<String> futureTask = new FutureTask<>(new CallerTask()); //启动线程 new Thread(futureTask).start(); try{ //等待任务执行完毕,并返回结果 String result = futureTask.get(); System.out.println(result); } catch (ExecutionException e){ e.printStackTrace(); } }}1234567891011121314151617181920212212345678910111213141516171819202122
所以这里实际上是通过实现Runnable接口的run方法去创建多线程。并new了一个线程对象。
赞 (0)