1.方式一: 继承Thread类
class ThreadTest extends Thread{
@Override
public void run() {
//线程代码
System.out.println("线程执行了...");
}
}
使用: 创建对象并调用其start方法
new ThreadTest().start()
2.方式二: 实现Runnable接口
实现: 自定义类实现Runnable接口,实现其run方法,将需要执行代码放到run方法中去
class ThreadTest implements Runnable{
@Override
public void run() {
//线程代码
System.out.println("线程执行了...");
}
}
使用: 将自定义类对象作为参数传入Thread类对象中去,然后调用Thread类对象的start方法
new Thread(new ThreadTest()).start()
3.方式三: 匿名内部类
实现: 本质同1,2
//1.继承Thread方式
new Thread(){
@Override
public void run() {
while(true){
System.out.println("Thread Success!");
}
}
}.start();
//2.实现Runnable接口方式
new Thread(new Runnable() {
@Override
public void run() {
while(true){
System.out.println("Runnable Success!");
}
}
}).start();
4.方式四: 带返回值的线程
实现: 自定义类实现Callable接口,实现其call方法,可带返回值
class CallableTask implements Callable<Integer>{
@Override
public Integer call() throws Exception {
System.out.println("正在计算...");
return 1;
}
}
使用: 将自定义类对象作为参数传递
CallableTask ct = new CallableTask();
FutureTask<Integer> ft = new FutureTask<Integer>(ct);
new Thread(ft).start(); //执行线程
Integer result = null;
try {
result = ft.get(); //获取线程执行的返回值
}catch (Exception e){
}
System.out.println("计算结果为: "+ result);
5.方式五: Timer(定时器)
使用: 创建Timer对象,然后执行其schedule(时刻表)方法
public void TimerTest(){
Timer timer = new Timer(); //创建一个定时器对象
timer.schedule(new TimerTask() {
@Override
public void run() { //线程任务
System.out.println("TImerTask is run ...");
}
},0,1000); //0秒后执行,毎1000毫秒执行一次线程任务
}
6.方式六: 线程池
使用: 根据不同需求创建不同的线程池对象, 例如:
Executors.newFixedThreadPool(10)
创建固定线程数的线程池Executors.newCachedThreadPool()
创建一个运行时自动扩充线程数的线程池
public void ThreadPoolTest(){
Executor threadPool = Executors.newCachedThreadPool(); //创建一个线程池(自动分配线程个数,不够用时自动创建)
//Executor threadPools = Executors.newFixedThreadPool(10); //创建一个线程数固定大小(10)的线程池
for(int i=0;i<100;i++){
threadPool.execute(new Runnable() { //将线程任务分配给线程池中的线程执行
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"执行了...");
}
});
}
}
7.方式七: spring对多线程的支持
8.方式八: lambda表达式(jdk8)
简单介绍
//并行计算
public int lambdaAdd(ArrayList<Integer> nums){
//并行计算集合nums进行求和
return nums.parallelStream().mapToInt(i -> i).sum();
//parallelStream为并发流
}
//并行输出
public void lambdPrint(ArrayList<Integer> nums){
//并行输出集合nums的值
nums.parallelStream().forEach(System.out::println);
}
测试
@Test
public void test(){
ArrayList<Integer> values = new ArrayList<Integer>();
values.add(10);
values.add(20);
values.add(40);
values.add(30);
lambdPrint(values);
System.out.println("result: "+ lambdaAdd(values));
}