Article Outline
创建与运行线程
一直也有用到多线程,但是感觉没有很系统的学习过,都是用的时候临时百度一下,趁着想总结,先记录一下。
方法一:直接使用Thread
Thread t =new Thread(){
public void run(){
//要执行的任务
}
} ;
t.start();//启动线程
//这种方法是重写了Thread的run方法,从而使得Thread在运行时,会执行重写的方法
方法二:
使用Runnable 配合Thread 把线程和任务分开,
Thread代表线程
Runnable表示可运行的任务(线程要执行的代码)
Runnable runnable =new Runnable(){
public void run(){
//要执行的任务
}
};
Thread t = new Thread(runnable);
t.start();
用Runnable更容易与线程池等高级api配合
用Runnable让任务类脱离了Thread继承体系,更灵活
方法三:
对于线程有返回值的情况
FutureTask能够接收Callable类型的参数,用来处理有返回结果的情况
public class Code{
public static LoggerLOGGER=LoggerFactory.getLogger(Code.class);
@Test
public void test() throws ExecutionException,InterruptedException{
FutureTask<Integer>futureTask = newFutureTask<>(()->{
LOGGER.info("1111111111111111");
Thread.sleep(1000);
return 100;
});
Threadthread = new Thread(futureTask,"线程1");
thread.start();
LOGGER.info(String.valueOf(futureTask.get()));
}
}
//在方法三的代码中,线程中有了返回值,返回值为100,通过futureTask.get()可以获取到返回值,这样可以实现线程间的信息传递。
函数式编程:
在java8中,开始引入了函数式编程。那么,什么样的代码可以化简成函数式编程呢?
@FunctionalInterface
public interface Runnable {
/**
* When an object implementing interface <code>Runnable</code> is used
* to create a thread, starting the thread causes the object's
* <code>run</code> method to be called in that separately executing
* thread.
* <p>
* The general contract of the method <code>run</code> is that it may
* take any action whatsoever.
*
* @see java.lang.Thread#run()
*/
public abstract void run();
}
以上的代码摘自JDK中的Runnable接口定义,可以看到Runnable只有一个方法,且含有@FunctionalInterface
注解,这样的,就可以化简为lambda表达式的形式。
如:
Runnable runnable =new Runnable(){
public void run(){
LOGGER.info("hello");
//要执行的任务
}
};
Thread t = new Thread(runnable);
t.start();
//这段代码,可以化简为:
Runnable runnable = ()-> { {
LOGGER.info("hello");//要执行的任务
}
};
Thread t = new Thread(runnable);
t.start();
}
//可以看到,new Runnable方法以及唯一的run方法被省略化简成了()->{
//}的形式。如果有参数,在()中声明参数即可。