创建线程
方法一:继承Thread类
private static class MyThread extends Thread{
public void run(){
for(int i=0;i<10;i++){
System.out.println(Thread.currentThread().getName()+"this is the "+i+" times");
try{
Thread.currentThread().sleep(500);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
方法二:实现Runnable接口
private static class MyRunnable implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" is running");
}
}
main函数
public static void main(String[] args) {
MyThread t0=new MyThread();
Thread t1=new Thread(new MyRunnable());
t0.start();
t1.start();
}
区别
获取当前线程对象的时候,方法一可以直接使用this来获取也可以使用Thread.currentThread来获取,方法二只能用Thread.currentThread来获取.
方法三:内部类创建
其实方法三可以写成两种方法,因为是用内部类的形式创建方法一和方法二.但是为了简便偷懒就放一起了.
内部类创建 方法一
Thread t0=new Thread(){
public void run(){
System.out.println(this.getName());
}
};
内部类创建 方法二
Thread t1=new Thread(new Runnable(){
public void run(){
System.out.println(Thread.currentThread().getName());
}
});
细心的小伙伴会发现为什么第一个方法是在Thread()后直接接上花括号创建内部类,而第二个方法是在Thread后的()内new了一个Runnable()之后再接上花括号.这是为什么呢?
因为内部类创建对象是直接new一个类后直接接{}然后再花括号{}内写需要的方法.就像第一个方法一样,这个是常规的内部类构造.
而第二个方法是使用内部类创建了一个Runnable对像,再将这个匿名对象当作参数传入Thread中.所以是放在Thread后面的()里面.
方法四 lambda表达式创建Runnable对象
public static void main(String[] args) {
Thread t0=new Thread(()->{
System.out.println(Thread.currentThread().getName());
});
Thread t1=new Thread(()-> System.out.println(Thread.currentThread().getName()));
t0.start();
t1.start();
}
lambda表达式的方法体只有一个执行语句的时候,可以不使用花括号{}
lambda表达式简述
(参数) -> {方法体}
可以理解为 (参数) 被用来 {方法体}
(参数)
->
{方法体}
方法五 添加线程名字
Thread t1=new Thread("name1");
Thread t2=new Thread(new Runnable(),"name2");
Thread t3=new Thread(()->{
System.out.println(Thread.currentThread().getName());
},"name3");
Thread t4=new Thread(new Runnable(){
public void run(){
System.out.println(Thread.currentThread().getName());
}
},"name4");