java中的多线程编程(J2SE入门14)
Java多线程编程
这里要先回忆一下进程,即运行中的程序,多任务操作系统中并发的一个任务(CPU是分时间片执行多个进程的),线程,其本质是进程中顺序的执行流程,进程有独立的进程空间进程中的数据存放空间(对空间和栈空间)是独立的。线程没有独立的存放数据的空间,他们的数据存储空间(堆空间)是共享的,线程间的栈空间是独立的,线程消耗的资源也比进程小。
线程,是进程(运行中的程序)中顺序的执行流程,进程可以划分出多个线程。
JVM(java虚拟机)本身就是一个进程,java只能够申请创建线程。
操作系统决定线程是否有优先级,独占式的操作系统中系统会有优先级的概念,共享式的操作系统则不会优先级的。
Java中的线程也是对象,线程类是Thread类,线程是操作系统创建并进行维护的资源,线程对象只能表示一个线程,他本身不是线程。只能通过线程对象来申请创建,中止线程,访问底层的线程资源。
线程包含了三部分,cpu资源,代码,数据存储空间。
线程对象调用start()方法,线程对象就会向操作系统申请线程启动,除了申请的线程,还有main方法的线程,也就是主线程。
注意:只有运行状态的线程才有机会执行代码,主线程的中止不会影响其他的正在运行中的线程,主线程中止也就是main()方法退出了,只有进程中的所有线程都中止时,进程(JVM进程)才会退出,只要有线程没有中止,进程就不会退出。
线程编程的两种方法
1,写一个类,继承Thread类,覆盖Thread类中继承来的run()方法,这样就写好了自定义的线程类。
2,写一个类,实现Runable接口,实现其中的run()方法。这种方法写好的类的对象需要作为线程类创建对象时构造方法的参数。
实现形式1:
Thread t=new a();
class a extends Thread{
public void run(){
//...
}
}
实现形式2:
Runable r=new b();//目标对象
Thread t=new Thread(r);//用目标对象构造线程对象
class b implements Runable{
public void run(){
//...
}
}
Thread的方法
public static void sleep(long millis) throws InterruptedException
括号中以毫秒为单位, 使线程停止一段时间,间隔期满后,线程不一定立即恢复执行.
当main()运行完毕,即使在结束时时间片还没有用完,CPU也放弃此时间片,继续运行其他程序。
Try{
Thread.sleep(1000);
}catch ( InterruptedException e){
e.printStackTrace(e);
}
public final void join() throws InterruptedException
表示其他运行线程放弃执行权,进入阻塞状态,直到调用线程结束。
实际上是把并发的线程变为串行运行。
线程的优先级:1-10,越大优先级越高,优先级越高被OS选中的可能性就越大。(不建议使用,因为不同操作系统的优先级并不相同,使得程序不具备跨平台性,这种优先级只是粗略地划分)。
public static void field()
使当前线程马上交出执行权,回到可运行状态,等待OS的再次调用。
Public final Boolean isActive()
验证当前线程是否是活动的,不管它是否正在运行。
线程的生命周期
下面为线程中的7种非常重要的状态:(有的书上也只有认为前五种状态:而将“锁池”和“等待池”都看成是“阻塞”状态的特殊情况:这种认识也是正确的,但是将“锁池”和“等待池”单独分离出来有利于对程序的理解)
1,初始状态,线程创建,线程对象调用start()方法。
2,可运行状态,也就是等待Cpu资源,等待运行的状态。
3,运行状态,获得了cpu资源,正在运行状态。
4,阻塞状态,也就是让出cpu资源,进入一种等待状态,而且不是可运行状态,有三种情况会进入阻塞状态。
1)如等待输入(输入设备进行处理,而CPU不处理),则放入阻塞,直到输入完毕,阻塞结束后会进入可运行状态。
2)线程休眠,线程对象调用sleep()方法,阻塞结束后会进入可运行状态。
3)线程对象2调用线程对象1的join()方法,那么线程对象2进入阻塞状态,直到线程对象1中止。
5,中止状态,也就是执行结束。
6,锁池状态
7,等待队列
以上是 java中的多线程编程(J2SE入门14) 的全部内容, 来源链接: utcz.com/z/393311.html