1.继承Thread类来实现线程

  1. /**
  2. * 实现方式一,继承Thread类,覆写run方法
  3. */
  4. public class MyThread extends Thread{
  5. @Override
  6. public void run() {
  7. for (int i = 0; i < 10; i++) {
  8. System.out.println("ThreadName:" + Thread.currentThread().getName() + ":" + i);
  9. }
  10. }
  11. }

这就是继承Thread的类来实现线程,我们可以看一下run方法的源码

  1. public void run() {
  2. if (target != null) {
  3. target.run();
  4. }
  5. }

这里说明了Thread类中的run方法如果target不为null,那么就调用target.run(),否则什么也不处理,而target的类型其实是Runnable,当线程实例是通过构造器Thread(Runnable target)创建的,那么target的值就是构造器中的值,否则target为null

2.实现Runnable接口来现实线程

  1. /**
  2. * 实现方式二,实现Runnable接口,覆写run方法
  3. */
  4. public class MyRunnable implements Runnable{
  5. @Override
  6. public void run() {
  7. for (int i = 0; i < 10; i++) {
  8. System.out.println("ThreadName:" + Thread.currentThread().getName() + ":" + i);
  9. }
  10. }
  11. }

3.使用匿名内部类实现线程

  1. /**
  2. * 匿名内部类
  3. */
  4. public static void anonymousThread() {
  5. new Thread() {
  6. //直接实现run方法
  7. @Override
  8. public void run() {
  9. for (int i = 0; i < 10; i++) {
  10. System.out.println("ThreadName:" + Thread.currentThread().getName() + ":" + i);
  11. }
  12. }
  13. }.start();
  14. }

4.实现Callable接口来实现线程

  1. /**
  2. * 实现了Callable接口,覆写Callable中的call方法
  3. */
  4. public class MyCallThread implements Callable<Integer> {
  5. @Override
  6. public Integer call() throws Exception {
  7. int sum = 0;
  8. for (int i = 0; i < 10; i++) {
  9. sum += i;
  10. }
  11. return sum;
  12. }
  13. }

5.实现用线程池来实现线程

严格的来说,这种方式的区别其实和直接实现Runnable接口区别不大,但是这里使用了线程池的方式

  1. /**
  2. * 用线程池的方式来实现线程
  3. */
  4. public class ThreadPool implements Runnable{
  5. @Override
  6. public void run() {
  7. for (int i = 0; i < 10; i++) {
  8. System.out.println("ThreadName:" + Thread.currentThread().getName() + ":" + i);
  9. }
  10. }
  11. }
  12. public static void ThreadPoolStart() {
  13. //创建一个容量大小为5的线程池
  14. ExecutorService pool = Executors.newFixedThreadPool(6);
  15. ThreadPoolExecutor executor = (ThreadPoolExecutor)pool;
  16. executor.setCorePoolSize(5);
  17. //开启线程
  18. executor.execute(new ThreadPool());
  19. executor.execute(new ThreadPool());
  20. executor.execute(new ThreadPool());
  21. executor.execute(new ThreadPool());
  22. executor.execute(new ThreadPool());
  23. }

6.Lambda实现线程1

  1. /**
  2. * 普通线程,无返回值
  3. */
  4. public static void Thread1() {
  5. //这里面的代码就是run方法区域
  6. new Thread(() -> {
  7. for (int i = 0; i < 10; i++) {
  8. System.out.println("ThreadName:" + Thread.currentThread().getName() + ":" + i);
  9. }
  10. }).start();
  11. }

7.Lambda实现线程2

  1. /**
  2. * 使用线程池实现异步线程
  3. */
  4. public static void Thread2() {
  5. ExecutorService pool = Executors.newFixedThreadPool(5);
  6. pool.submit(() -> {
  7. for (int i = 0; i < 10; i++) {
  8. System.out.println("ThreadName:" + Thread.currentThread().getName() + ":" + i);
  9. }
  10. });
  11. }

8.Lambda实现线程3

  1. /**
  2. * 使用线程池实现异步线程,可以返回参数
  3. */
  4. public static String Thread3() {
  5. ExecutorService pool = Executors.newFixedThreadPool(5);
  6. Future<String> result = (Future<String>) pool.submit(() -> {
  7. for (int i = 0; i < 10; i++) {
  8. System.out.println("ThreadName:" + Thread.currentThread().getName() + ":" + i);
  9. }
  10. });
  11. try {
  12. return result.get();
  13. } catch (InterruptedException e) {
  14. e.printStackTrace();
  15. } catch (ExecutionException e) {
  16. e.printStackTrace();
  17. }
  18. return null;
  19. }
  20. }

点击 源码下载