多线程的创建
Java语言的JVM允许程序运行多个线程,它通过Java.lang.Thread类来实现。其创建方法如下:
方式一:继承于Thread类
1.创建一个继承于Thread类的子类
class MyThread extends Thread{
}
2.重写Thread类的run(),将此线程执行的操作声明在run()方法中
class MyThread extends Thread{
public void run(){
//执行的操作程序
}
}
3.创建Thread类的子类的对象
MyThread t1 = new MyThread();
4.通过此对象调用start()
t1.start();
方式二:实现Runnable接口
1.创建一个实现了Runnable接口的类
class MThread implements Runnable{
}
2.实现类去实现Runnable中的抽象方法,run()
class MThread implements Runnable{
public void run(){
//执行操作的程序
}
}
3.创建实现类的对象
MThread m1=new MThread();
4.将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
Thread t1 =new Thread(m1);
5.通过Thread类的对象调用start()
t1.start();
两种方式的比较
开发中,优先选择实现Runnable接口的方式
原因:
1.实现的方式没有类的单继承的局限性
2.实现的方式更适合来处理多个线程有共享数据的情况
联系:public class Thread implements Runnable
相同点:两种方式都需要重写run(),将线程要执行的逻辑声明在run()中。
除了上面两种多线程创建方法,JDK5.0又新增了两种多线程的创建方法:
方式三:实现Callable接口
1.创建一个实现Callable的实现类
class NumThread implements Callable{
}
2.实现call方法,将此线程需要执行的操作声明在call方法中
class NumThread implements Callable{
@Override
public Object call() throws Exception {
return null;
}
}
3.创建Callable接口实现类的对象
NumThread numThread= new NumThread();
4.将此Callable接口实现类的对象作为传递到FutureTask构造器中,创建FutureTask的对象
FutureTask futureTask = new FutureTask(numThread);
5.将FutureTask的对象作为参数传递到Thread类的构造器中,创建Thread对象,并调用start()
new Thread(futureTask).start();
方式四:使用线程池
1.创建一个实现了Runnable接口的类
class NumberThread implements Runnable{
}
2.实现类去实现Runnable中的抽象方法,run()
class NumberThread implements Runnable{
public void run(){
//执行的程序
}
}
3.提供指定线程数量的线程池,此时指定为10
ExecutorService service = Executors.newFixedThreadPool(10);
4.执行指定的线程的操作,需要提供实现Runnable接口或Callable接口实现类的对象
service.execute(new NumberThread());//适合适用于Runnable
//service.submit();//适合适用于Callable
5.关闭线程池
service.shutdown();