一个程序运行后至少有一个进程,一个进程中可以包含多个线程,但至少包含一个线程,
一个线程与父进程的其他线程共享该进程所拥有的全部资源。
继承Thread类创建线程类
1.定义thread类的子类,并重写该类的run方法(线程执行体),
该run方法就是代表线程需要完成的任务。
2.创建Thread子类的实例,即创建线程对象。
进行多线程编程时不要忘记了Java程序运行时默认的主线程,main()方法的方法体就是主线程的线程执行体。
使用继承Thread类的方法来创建线程类时,多个线程之间无法共享线程类的实例变量
线程都是通过拓展Thread类创建的,同时也可以使用Runnable接口来创建线程类
1.定义Runnable接口的实现类,并重写该接口的方法,这个代表此个方法中的线程执行体。
2.创建Runnable实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象。
//创建Runnable实现类的对象
SecondThread st=new SecondThread();
//以Runnable实现类的对象作为Thread的target来创建Thread对象,即线程对象
new Thread(st)或 new Thread(st,\"新线程1\");
3.调用线程对象的start方法来启动该线程
启动线程使用start()方法,而不是run()方法,永远不要调用线程对象的run方法,调用start方法来启动线程,系统会把该run方法当成线程执行体来处理;
如果希望调用子线程的start方法后子线程立即开始执行,程序可以使用Thread.sleep(1)来让当前运行的线程睡眠1毫秒,因为1毫秒内CPU不会空闲,它会去执行另一个处于就绪状态的线程,这样就可以让子线程立即开始执行.
如果处于就绪状态的线程获得了CPU,开始执行run方法的线程执行体,则线程处于运行状态,但一个CPU在任何时刻只能有一个线程处于运行状态,当一个线程开始运行后,它不可能一直处于运行状态,线程在运行过程中需要被中断,目的是使其他线程获得执行的机会,线程调度的细节取决于底层平台所采用的策略。对于采用抢占式策略的系统而言,系统会给每个可执行的线程一个小时间段来处理任务;当该时间段用完后,系统就会剥夺该线程所占用的资源,让其他线程获得执行的机会。
一个CPU在任何时刻只能有一个线程处于运行状态。
使线程进入阻塞状态的几种情况:
1.线程调用sleep()方法主动放弃所占用的处理器资源。
2.调用一个阻塞式IO方法,在该方法返回之前,该线程被阻塞。
3.等待某个通知。
4.调用suspend()方法将该线程挂起
让线程重新进入就绪状态的几种情况:
1.调用sleep()方法的线程经过了指定时间。
2.线程调用的阻塞式IO方法已经返回。
3.成功获得了试图取得的同步监听器。
4.线程正在等待某个通知,其他线程发出了一个通知。
5.处于挂起状态的线程suspend()被调用了resume()恢复方法。
线程会以下面三种方式结束,结束后就处于死亡状态:
(1)run()或call()方法执行完成,线程正常结束
(2)线程抛出一个未捕获的Exception或Error
(3)直接调用该线程的stop()方法来结束该线程
调用Thread对象setDaemon(true)方法可将指定线程设置成后台线程。
static void sleep(long millis):让当前正在执行的线程暂停millis毫秒,并进入阻塞状态,该方法受到系统计时器和线程调度器的精度和准确度的影响。
setPriority(int newPriority) 来设置指定线程的优先级。
同步方法就是使用synchronized关键字来修饰某个方法,
某个对象调用了同步方法,该对象上的其他同步方法必须等待该同步方法执行完毕才能被执行,必须将每个能访问共享资源的方法修饰为synchronized,否则就会出错
// 提供一个线程安全draw()方法来完成取钱操作
public synchronized void draw(double drawAmount)
wait()方法,导致当前线程等待
notify()方法,唤醒在此同步监听器上等待的单个线程。
线程组成:
栈空间 局部变量 独立
堆空间 保存对象 共享
版权声明
本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。



