1、使用多线程技术时,代码的运行结果与代码执行顺序或调用顺序是无关的。
2、线程是一个子任务,CPU以不确定的方式,或者说是以随机的时间来调用线程中的run方法。
3、如果多次调用start()方法,则会出现异常:Exception in thread "main" java.lang.IllegalThreadStateException
4、CPU执行哪个线程具有不确定性。
5、start()方法通知“线程规划器”此线程已经准备就绪,等待调用线程对象的run()方法。
6、启动线程,具有异步执行的效果。如果调用代码thread.run()就不是异步执行了,而是同步,那么此线程对象并不交给“线程规划器”来进行处理,而是由main主线程来调用run()方法。
7、构造函数Thread(Runnable)不光可以转入Runnable接口的对象,还可以传入一个Thread对象,这样做完全可以将一个Thread对象中的run()方法交由其他的线程进行调用。
8、自定义线程类中的实例变量针对其他线程可以有共享与不共享之分。共享数据的情况就是多个线程可以访问同一个变量,比如在实现投票功能的软件时,多个线程可以同时处理同一个人的票数。
9、通过run方法前加synchronized关键字,使多线程在执行run方法时,以排队的方式进行处理。当一个线程调用run前,先判断run方法有没有被上锁,如果上锁,说明有其他线程正在调用run方法。这样也就实现了排队调用run方法的目的。
10,synchronized可以在任意对象及方法上加锁,而加锁的这段代码称为“互斥区”或“临界区”。
11、当一个线程想要执行同步方法里面的代码时,线程首先尝试去拿这把锁,如果能够拿到这把锁,那么这个线程就可以执行synchronize里面的代码。如果不能拿到这把锁,那么这个线程就会不断地尝试拿到这把锁,知道能够拿到为止,而且是有多个线程同时去争抢这把锁。
12、非线程安全主要是指多个线程对同一个对象中的同一个实例变量进行操作时会出现值被更改、值不同的情况,进而影响程序的执行流程。
13、解决非线程安全问题使用的是synchronized关键字。
14,、currentThread()方法可返回代码正在被哪个线程调用的信息。
15、main方法被名为main的线程调用。
16、类的构造函数是被main线程调用的。
17、isAlive()的功能是判断当前的线程是否处于活动状态。活动状态就是线程已经启动且尚未终止。
18、方法sleep()的作用是在指定的毫秒内让当前“正在执行的线程”休眠。这个“正在执行的线程”是指this.currentThread()返回的线程。
19、getId()方法的作用是取得线程的唯一标识。 Thread runThread = Thread.currentThread(); runThread.getName( ) runThread.getId( )
20、停止一个线程意味着在线程处理完任务之前停掉正在做的操作,也就是放弃当前的操作。
21、停止一个线程最好不要使用Thread.stop()方法,不安全。大多数停止一个线程的操作使用Thread.interrupt()方法。
22、调用interrupt()方法仅仅是当前线程中打了一个停止的标记,并不是真的停止线程。
23、判断线程的状态是不是停止的,有两种方法:
1)this.interrupted():测试当前线程是否已经中断。
2)this.isInterrupted():测试线程是否已经中断。