Java中创建线程的三种方式
- –继承Thread类创建线程
- –实现Runnable接口创建线程
- –使用Callable 和Future创建线程
继承Thread类实现多线程
package com.ygq.thread;
import java.util.Random;
public class Match1 {
public static void main(String[] args) {
Runner liuxiang = new Runner();
liuxiang.setName("刘翔");
Runner xiaoyin = new Runner();
xiaoyin.setName("小尹");
Runner op = new Runner();
op.setName("路飞");
liuxiang.start();
xiaoyin.start();
op.start();
}
}
class Runner extends Thread{
@Override
public void run() {
Integer speed = new Random().nextInt(100);
for (int i = 0; i <= 100; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(this.getName() + "已前进" + (i*speed) + "米 " + (speed + "米/秒"));
}
}
}
实现Runnable接口
package com.ygq.thread;
import java.util.Random;
public class Match2 {
public static void main(String[] args) {
Runner2 liuxiang = new Runner2();
Thread thread1 = new Thread(liuxiang);
thread1.setName("刘翔");
thread1.start();
Thread xiaoyin = new Thread(new Runner2());
xiaoyin.setName("小尹");
xiaoyin.start();
Thread op = new Thread(new Runner2());
op.setName("路飞");
op.start();
}
}
class Runner2 implements Runnable{
public void run() {
Integer speed = new Random().nextInt(100);
for (int i = 0; i <= 100; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "已前进" + (i*speed) + "米 " + (speed + "米/秒"));
}
}
}
利用线程池-实现Callable接口
- –JDK1.5 以后为我们提供了一个并发工具包java.util.concurrent
- –java.util.concurrent 包含许多线程安全、测试良好、高性能的并发构建块,创建concurrent的目的就是要实现Collection框架对数据结构所执行的并发操作, 通过提供一组可靠的、高性能并发构建块, 开发人员可以提高并发类的线程安全, 可伸缩性,性能, 可读性和可靠性
package com.ygq.thread;
import java.util.Random;
import java.util.concurrent.*;
public class Match3 {
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService executorService = Executors.newFixedThreadPool(3);
Runner3 liuxiang = new Runner3();
liuxiang.setName("刘翔");
Future<Integer> result1 = executorService.submit(liuxiang);
Runner3 xiaoyin = new Runner3();
xiaoyin.setName("小尹");
Future<Integer> result2 = executorService.submit(xiaoyin);
Runner3 op = new Runner3();
op.setName("路飞");
Future<Integer> result3 = executorService.submit(op);
Runner3 op1 = new Runner3();
op1.setName("路飞1");
Future<Integer> result4 = executorService.submit(op1);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
executorService.shutdown();
System.out.println("刘翔累计跑了 " + result1.get() + " 米");
System.out.println("小尹累计跑了 " + result2.get() + " 米");
System.out.println("路飞累计跑了 " + result3.get() + " 米");
System.out.println("路飞1累计跑了 " + result4.get() + " 米");
}
}
class Runner3 implements Callable<Integer>{
private String name;
public void setName(String name) {
this.name = name;
}
public Integer call() throws Exception {
Integer speed = new Random().nextInt(100);
Integer distince = 0;
for (int i = 0; i <= 100; i++) {
Thread.sleep(10);
distince = i * speed;
System.out.println(this.name + "已前进" + distince + "米 " + (speed + "米/秒"));
}
return distince;
}
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/3f0b0b0e7ee80fbaab5440313aa50454.png)