P486-P500
《Head First Java》20201028读书笔记
线程
我们需要同时执行的能力,检查服务器信息的同时不会打断用户与GUI的交互。
因此用户可以输入信息或滚动接受画面,还需要有东西在背景持续地读取服务器的数据。
这意味着我们需要新的线程(thread),一个独立的执行空间(stack)。
我们想要让只能发送的版本可以维持原来的执行,同时有新的进程(process)并行地读取服务器的信息并将它显示在文本区域上。
Java的multithreading
Java在语言中就有内置多线程的功能。
建立新的线程来执行是很简单的:
thread t = new Thread();
t.start( );
建立出新的线程对象就会启动新的线程,它是个独立的调用执行空间。
Java的多个线程课题意味着我们得要讨论线程与它的任务,以及java.lang中的Thread这个类(要记得java.lang是默认就有被import的,它是包括String和System等语言本身的基础)。
Java有多个线程但只有一种Thread类
线程是独立的线程。它代表独立的执行空间。
Thread是Java中用来表达线程的类。
要建立线程就得创建Thread。
在Java中以大写字母开始的东西是类,所以Thread是java.lang这个包中的一个类。Thread对象代表线程,当你需要启动新的线程时就建立Thread的实例。
线程是独立的线程,它代表独立的执行空间。
每个Java应用程序会启动一个主线程——将main()放在它自己执行空间的最开始处。
Java虚拟机会负责主线程的启动(以及比如垃圾收集所需的系统用线程)。
程序员得负责启动自己建立的线程。
有一个以上的执行空间代表什么?
当有超过一个以上的执行空间时,看起来会像是有好几件事情同时发生,实际上只有真正的多处理器系统能够同时执行好几件事,但使用Java的线程可以让它看起来好像同时都在执行中。
也就是说,执行动作可以在执行空间非常快速地来回交换,因此会感觉每项任务都在执行。
如何启动新的线程
Runnable threadJob = new MyRunnable();
//建立Runnable对象(线程的任务)
Thread myThread = new Thread(threadJob);
//建立Thread对象(执行工人)并赋值Runnable(任务)
myThread.start();
//启动Thread
每个Thread需要一个任务来执行。一个可以放在执行空间的任务。
- 以小写t描述的thread是个独立的线程。
- Java中的每个线程都有独立的执行空间。
- 大写T的Thread是java.lang.Thread这个类。它的对象是用来表示线程。
- Thread需要任务,任务是实现过Runnable的实例。
- Runnable这个接口只有以一个办法。
- run()会是新线程所执行的第一项方法。
- 要把Runnable传给Threada的构造函数才能启动新的线程。
- 线程在初始化以后还没有调用start()之前处于新建立的状态。
- 调用Thread对象的start()之后,会建立出新的执行空间,它处于可执行状态等待被挑出来执行。
- 当Java虚拟机的调度器选择某个线程之后它就处于执行中的状态,单处理器的机器只能有一个执行中的线程。
- 有时线程会因为某些原因而被堵塞。
- 调度不能保证任何的执行时间和顺序,所以要你不能期待它会完全地平均分配执行,你最多也只能影响sleep的最小保证时间。