java实现多线程
- 继承 extends java.lang.Thread或其子类
- 创建多线程 继承Thread
- 重写Run()方法
- 使用线程 创建Thread的子类对象
- 调用子类对象的start()方法
缺点:Java单继承特性,如果已经继承其他类,则不能再继承Thread类。
/**
* 创建多线程:继承Thread 重写run()
*/
public class ThreadTest extends Thread{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("i:"+i);
}
}
}
public class TestMain {
public static void main(String[] args) {
ThreadTest ts=new ThreadTest(); //创建子类对象
ts.start();//调用start()
}
}
- 通过实现Runnable接口 实现多线程。
- 实现Runnable接口
- 重写Run()方法
- 使用Start()方法
优点:可以同时实现继承。
//实现了java.lang.Runnable接口
public class MyRunnable implements Runnable {
public void run(){
System.out.println("MyRunnable running");
}
}
//为了使线程能够执行run()方法,需要在Thread类的构造函数中传入 MyRunnable的实例对象
Thread thread = new Thread(new MyRunnable());
thread.start();
//当创建一个线程的时候,可以给线程起一个名字.
MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable, "New Thread");
thread.start();
System.out.println(thread.getName());
//得到当前线程的引用
Thread.currentThread();
//得到当前线程的名字
String threadName = Thread.currentThread().getName();
//输出执行main()方法线程名字。这个线程JVM分配的。然后开启10个线程,命名为1~10。每个线程输出自己的名字后就退出。
public class ThreadExample {
public static void main(String[] args){
System.out.println(Thread.currentThread().getName());
for(int i=0; i<10; i++){
new Thread("" + i){
public void run(){
System.out.println("Thread: " + getName() + "running");
}
}.start();
}
}
}
通过实现callable接口 实现多线程
1. 创建callable实现类+重写call
2. 借助执行调度服务 ExecutorService 获取Future对象
ExecutorService ser=Executors.newFixedThreadPool(2);
Future future =ser.submit(task:实现类对象);、
3. 获取值 future.get();
4. 停止服务 ser.shutdownNow();
使用callable 创建线程比较繁琐。
Runnable和Callable的区别是:
- Callable规定的方法是call(),Runnable规定的方法是run()。其中Runnable可以提交给Thread来包装下,直接启动一个线程来执行,而Callable则一般都是提交给ExecuteService来执行。
- Callable的任务执行后可返回值,而Runnable的任务是不能返回值得
- call方法可以抛出异常,run方法不可以
- 运行Callable任务可以拿到一个Future对象,c表示异步计算的结果。
Runnable和Callable的区别 参考:https://blog.csdn.net/qq_27258799/article/details/51451143