第一种方式:
继承Thread类创建线程类
-
定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。
-
创建Thread子类的实例,即创建了线程对象。
-
调用线程对象的start()方法来启动该线程。
Thread thread1 = new Thread() {
@Override
public void run(){
while(true){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("1:" + Thread.currentThread().getName());
System.out.println("2:" + this.getName());
}
}
};
thread1.start();
第二种方式:
通过Runnable接口创建线程类
-
定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。
-
创建 Runnable实现类的实例,并依此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。
-
调用线程对象的start()方法来启动该线程。
Thread thread2 = new Thread(new Runnable(){
@Override
public void run() {
while(true){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("1:" + Thread.currentThread().getName());
}
}
});
thread2.start();
第三种方式:
通过Callable和Future创建线程
-
创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。
-
创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。
-
使用FutureTask对象作为Thread对象的target创建并启动新线程。
-
调用FutureTask对象的get()方法来获得子线程执行结束后的返回值。
public class Mythead implements Callable<String>{
@Override
public String call() throws Exception {
return "就是我在运行。。。。";
}
}
public class Test {
public static void main(String[] args) throws Exception {
FutureTask<String> futureTask = new FutureTask<String>(new Mythead());
new Thread(futureTask).start();
String ss= futureTask.get();
System.out.println(ss);
}
}
第四种方式:
使用Excutor框架来创建线程池
1.newSingleThreadExecutor()//单例线程
2.newFixedThreadPool(int)//固定的线程数
3.newCachedThreadPool() //缓存型线程池
4.newScheduledThreadPool(int) //调度型线程池,里面的线程可以按schedule依次delay执行,或周期执行。
详细待更新。。。