HOME/Articles/

java多线程-1

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方法被省略化简成了()->{

//}的形式。如果有参数,在()中声明参数即可。