读书笔记-Java多线程编程核心技术-01

0 写在前面

之前零散了自学了一些Java多线程方面的知识,明白了一些概念,还是有些凌乱,从读《Java多线程编程核心技术》开始,从头学习多线程相关内容,并做系统的记录。

 

1 进程、线程与多线程
进程与线程是操作系统里的内容,这里简单的说一下概念,关于并发并行、CPU调度等内容可以阅读操作系统相关书籍。

  • 进程:可以看做系统中运行的程序,在Windows资源管理器中“进程”列表,可以具象的看到进程。
  • 线程:一个进程可以分成几个线程,线程是进程当中的子单位,线程之间可以共享所属进程的部分资源。
  • 多线程:顾名思义就是多个线程并发执行。

注:并行是多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时;并发是通过cpu调度算法,让用户看上去同时执行,实际上从cpu操作层面不是真正的同时。

2 使用多线程

在没有使用多线程之前,可能对如何在代码中实现线程很神秘,我自己在最初就因为不了解,对多线程很恐惧,觉得肯定很复杂。其实对多线程的使用与我们对类的使用是一样的,并没有高深莫测,只是线程中一些相关方法需要学习一下。下面就来看一看如何实现多线程:

在Java中,有两种方法来得到线程。一是继承Thread类,二是实现Runnable接口。使用继承Thread类的方式创建新线程时,最大的局限就是不支持多继承。因为Java语言的特点就是单根继承。当需要支持多继承时,就要采用实现Runnable接口的方式。两种实现方法没有本质区别。


2.1 继承Thread类
Thread类结构

1 public class Thread implements Runnable

可以看Thread类实现了Runnable接口。这就更加明确上文所说的,两种实现方式没有本质区别。

我们以一个实例来学习,如果暂时不明白,没有关系,先依样画葫芦敲一遍,我们后面会讲详细内容。

线程类:

1 public class MyThread extends Thread{
2     @Override
3     public void run(){
4         super.run();
5         System.out.println("MyThread");
6     }
7 }

运行类:

1 public class Main{
2     public static void main(String[] args){
3         MyThread myThread=new MyThread();
4         myThread.start();
5         System.out.println("运行结束");
6     }
7 }

执行main方法,运行结果:

运行结束
MyThread

在运行main方法之后,你就已经成功的创建并使用了一个线程。所谓多线程就是对多个Thread对象的使用,这样一来就不会觉得多线程有多神秘了吧。

通过输出结果我们可以看到,MyThread类中的run方法执行时间较晚,这也是说明,在使用多线程技术时,代码的运行结果与代码执行顺序或调用顺序无关的。线程是一个子任务,CPU以不确定的方式来调用线程中的run方法,所以会先打印“运行结束”后打印“MyThread”。其原因其实是,当你调用start方法时,线程并没有正在执行,它正处于就绪状态,线程的调度是由JVM(Java虚拟机)来完成 的。关于线程的几个状态,会在之后说明。所以调用线程start方法的顺序,并不一定是线程运行的顺序。

注:需要明白的是,main方法自己其实也是一个线程。


2.2 实现Runnable接口

如果想要创建线程的线程类,已经有了一个父类,这是就不能再继承自Thread类了,因为Java不支持多继承。因此需要实现Runnable接口来解决这个情况。如何采用实现Runnable接口的方式,我们还是以实例来看:

线程类:

1 public class MyRunnable implements Runnable{
2     @Override
3     public void run() {
4         System.out.println("MyRunnable");
5     }
6 }

运行类:

1 public class Main{
2     public static void main(String[] args){
3         Runnable runnable=new MyRunnable();
4         Thread thread=new Thread(runnable);
5         thread.start();
6         System.out.println("运行结束");
7     }
8 }

运行结果:

运行结束
MyRunnable

这样我们就成功的用实现Runnable接口的方式来创建线程。这里我们是把Runnable接口的实现类,作为Thread类构造方法的参数,从而创建线程的。学习的时候先会用,有个概念,详细内容以后会讲到。

 

看完这篇之后,应该对线程有了基本的认识,对Java中如何创建线程也有了了解。下一篇将讲解线程的生命周期,明白线程什么时候创建,什么时候执行,什么时候结束。

 

posted @ 2018-01-09 15:40  dingyufan  阅读(112)  评论(0)    收藏  举报