创建线程的三种方式:
1)继承Thread类创建线程类
2)通过Runnable接口创建线程类
3)通过Callable和Future创建线程类
一、继承Thread
/**
* 创建线程方法1:
* 继承Thread类,重写run方法,新建当前类对象,调用start()方法
*/
public class Thread_demo1 extends Thread {
public int j;
public static void main(String[] args) {
Thread_demo1 t1 = new Thread_demo1();
Thread_demo1 t2 = new Thread_demo1();
t1.setName("A线程");
t2.setName("B线程");
t1.start();
t2.start();
}
@Override
public void run() {
for (int i=0; i<10; i++) {
synchronized (Thread_demo1.class) {
j++;
System.out.println(getName() + ".." + j);
}
}
}
}
二、实现Runnable接口
/**
* 创建线程方法2:
* 实现Runnable接口,创建当前类对象,再创建Thread类对象,调用start方法
*/
public class Thread_demo2 implements Runnable {
private int j;
@Override
public void run() {
for (int i=0; i<10; i++) {
//System.out.println(Thread.currentThread().getName() + "线程...");
synchronized (Thread_demo2.class) {
j++;
System.out.println(Thread.currentThread().getName() + ".." + j);
}
}
}
public static void main(String[] args) {
Thread_demo2 thread = new Thread_demo2();
Thread t1 = new Thread(thread, "A线程");
Thread t2 = new Thread(thread, "B线程");
t1.start();
t2.start();
}
}
三、实现Callable接口
/**
* 创建线程方法3:
* 1.实现Callable接口,重写call方法
* 2.新建当前类对象
* 3.新建FutureTask对象,传入当前类对象
* 4.新建Thread对象,传入Future对象
* 5.调用start()方法
*
* call方法相比run方法,可以有返回值并且可抛出异常类
*/
public class Thread_demo3 implements Callable<String> {
public int j;
@Override
public String call() throws Exception {
for (int i=0; i<10; i++) {
synchronized (Thread_demo3.class) {
j++;
System.out.println(Thread.currentThread().getName() + ".." + j);
}
}
Thread.sleep(5000);
return Thread.currentThread().getName();
}
public static void main(String[] args) {
Thread_demo3 thread = new Thread_demo3();
FutureTask<String> task1 = new FutureTask<String>(thread);
FutureTask<String> task2 = new FutureTask<String>(thread);
Thread t1 = new Thread(task1, "A线程");
Thread t2 = new Thread(task2, "B线程");
t1.start();
t2.start();
try {
System.out.println(task1.get()); // 可获取到返回值
System.out.println(task2.get()); // 可获取到返回值
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}