线程与并发了解
相信大家观看上文,对线程有了一定的了解,下面就让我们来加强对线程的创建吧!?
创建线程?
方式一:直接使用Thread
package com.luo_sf.map;
/**
* 创建线程
*/
public class Text {
public static void main(String[] args) {
//创建线程对象
Thread t = new Thread(){
@Override
public void run(){
//执行代码
System.out.println("张三真是个大帅哥!");
}
};
//指定名称(方便日志查看)
t.setName("text");
//启动线程
t.start();
System.out.println("法外狂徒!");
}
}
方式二(Runnable+Thread 推荐使用):
把线程与任务分开,是线程更加灵活!
Thread:代表线程
Runnable :可运行任务(线程需要执行的代码)
package com.luo_sf.map;
/**
* 创建线程
* 方法二
*/
public class Text {
public static void main(String[] args) {
Runnable r = new Runnable(){
@Override
public void run() {
System.out.println("张三真是个大帅哥!");
}
};
//Thread 第一个参数Runnable的名称 ,第二个为线程名称:
Thread t = new Thread(r,"t2");
//启动线程
t.start();
System.out.println("法外狂徒!");
}
}
Runnable与Thread的关系
?根据源码解析分析:方法一与方法二运行时,走的都是线程中的ran();
1,Thread是把线程与任务和在一起,而Runnable+Thread是把线程与任务分开
2,Runnable更加与线程池等API配合
3.Runnable让线程更加灵活
(jdk8.0后可以使用lamdba表达式):
让代码更加简洁,但可读性差。
package com.luo_sf.map;
/**
* 创建线程
* 方法三
*/
public class Text {
public static void main(String[] args) {
//方式一:自己修改
Runnable r = ()->{
System.out.println("张三真是个大帅哥!");
};
//方式二:idea快捷键 alt+Enter
Runnable rn = () -> System.out.println("张三真是个大帅哥!");
//Thread 第一个参数线程的名称 ,第二个自己修改线程名称(方便查找):
Thread t = new Thread(r,"t2");
Thread t1 =new Thread(rn,"t3");
//启动线程
t.start();
t1.start();
System.out.println("法外狂徒!");
}
}
方法三(FutureTask+Thread):
package com.luo_sf.map;
import javax.security.auth.callback.CallbackHandler;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
/**
* 创建线程
* 方法三
*/
public class Text {
public static void main(String[] args) {
FutureTask<Integer> task = new FutureTask<>(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
System.out.println("张三真是个大帅哥!");
return null;
}
});
//Thread 第一个参数线程的名称 ,第二个自己修改线程名称(方便查找):
Thread t = new Thread(task,"t2");
//启动线程
t.start();
System.out.println("法外狂徒!");
//获取FutureTask的返回结果
//task.get();
}
}
|