线程的创建和启动
1.继承Thread来创建线程
public class Demo extends Thread
{
private xx;
public void run()
{
//这个线程要执行的东西
.......
}
public static void main(String []__)
{
Demo th=new Demo();
th.start();
}
}
这样就算是创建了一个线程
两个方法介绍
- Thread中的currentThread(),返回当前正在运行的线程
- getName(),返回线程名字
- 创建的时候,传递进去string类型的参数当做线程名字
2.实现Runnable类来作为参数传递
class A extends Runnable
{
private int age;//共同的field
public void run()
{
....
}
public static void main(String[]__)
{
A paremeter = new A();
Thread test=new Thread(paremeter);
test.start();
Thread other=new Thread(paremeter);
other.start();
//如果我们的run里面对于共享的变量age做出了修改,其实这两个线程中,field是相同的,可能会造成共享的数据出现访问冲突,可以考虑使用volatile关键字
}
}
3.使用Callable和Future来创建线程(jdk1.5加入)
步骤如下:
- 创建callable接口的实现类,并且实现call()方法,这个call()方法将作为线程的执行体
- 创建实现类的实例,使用Futuretask类来保证Callable对象,这个FutureTask对象封装了该Callable对象call方法的返回值,也就是线程的执行体可以有返回值了
- 将FutureTask对象作为thread的target,创建并且启动线程。
- 使用 FutureTask对象的get方法获得子线程执行结束之后返回的数值
package thread;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class CallableDemo implements Callable<Integer>
{
@Override
public Integer call() throws Exception {
int i=0;
for(;i<99;i++)
{
System.out.println(i+" "+Thread.currentThread().getName());
}
return i;
}
public static void main(String[]__)
{
//创建callable对象
CallableDemo rt=new CallableDemo();
//把callable绑定到FutureTask对象上面
FutureTask<Integer> task=new FutureTask<>(rt);
//把任务加入thread的target中去
new Thread(task).start();
try {
System.out.println(task.isDone()+" "+task.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
new Thread(task).start();
try {
System.out.println(task.isDone()+" "+task.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
//他们的field也是只有一块,一个线程跑完会修改field中的数值
}
}
优点:
- 具有返回值
- 可以抛出异常
缺点:
- 使用get方法得到返回值可能抛出异常,线程可能没有执行完毕
- get()方法会阻塞主线程,直到all方法返回
4.匿名方式创建线程(与Runnable同)
new Thread(new Runnable() {
private int i=0;
@Override
public void run() {
System.out.println(i);
}
},String.valueOf("1")).start();
优点:
- 方便快捷
缺点:
- 复用性低