For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
今天带给大家的干货知识是java线程学习日志
一、线程的概念:
线程与进程相似,是一段完成某个特定功能的代码,是程序中单个顺序的流控制;但与进程不同的是,同类的多个线程是共享一块内存空间和一组系统资源,而线程本身的数据通常只有微处理器的寄存器数据,以及一个供程序执行时使用的堆栈。所以系统在产生一个线程,或者在各个线程之间切换时,负担要比进程小的多,正因如此,线程被称为轻负荷进程(light-weight process)。一个进程中可以包含多个线程。
一个线程是一个程序内部的顺序控制流。
1. 进程:每个进程都有独立的代码和数据空间(进程上下文) ,进程切换的开销大。
2. 线程:轻量的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(pc),线程切换的开销小。
3. 多进程:在操作系统中,能同时运行多个任务程序。
4. 多线程:在同一应用程序中,有多个顺序流同时执行。
java内在支持多线程,它的所有类都是在多线程下定义的,java利用多线程使整个系统成为异步系统。
1. 虚拟的cpu,封装在java.lang.thread类中。
2. cpu所执行的代码,传递给thread类。
3. cpu所处理的数据,传递给thread类。
二、线程的构造
线程实例表示java解释器中的真正的线程,通过它可以启动线程、终止线程、线程挂起等,每个线程都是通过类thread在java的软件包java.lang中定义,它的构造方法为:
public thread (threadgroup group,runnable target,string name);
其中,group 指明该线程所属的线程组;target实际执行线程体的目标对象,它必须实现接口runnable; name为线程名。java中的每个线程都有自己的名称,java提供了不同thread类构造器,允许给线程指定名称。如果name为null时,则java自动提供唯一的名称。
当上述构造方法的某个参数为null时,我们可得到下面的几个构造方法:
public thread ();
public thread (runnable target);
public thread (runnable target,string name);
public thread (string name);
public thread (threadgroup group,runnable target);
public thread (threadgroup group,string name);
一个类声明实现runnable接口就可以充当线程体,在接口runnable中只定义了一个方法 run():
public void run();
任何实现接口runnable的对象都可以作为一个线程的目标对象,类thread本身也实现了接口runnable,因此我们可以通过两种方法实现线程体。
(一)定义一个线程类,它继承线程类thread并重写其中的方法 run(),这时在初始化这个类的实例时,目标target可为null,表示由这个实例对来执行线程体。由于java只支持单重继承,用这种方法定义的类不能再继承其它父类。
(二)提供一个实现接口runnable的类作为一个线程的目标对象,在初始化一个thread类或者thread子类的线程对象时,把目标对象传递给这个线程实例,由该目标对象提供线程体 run()。这时,实现接口runnable的类仍然可以继承其它父类。
三、线程的状态
每个线程都是通过某个特定thread对象的方法run( )来完成其操作的,方法run( )称为线程体。下图表示了java线程的不同状态以及状态之间转换所调用的方法。
1. 创建状态(new thread)
执行下列语句时,线程就处于创建状态:
thread mythread = new thread( );
当一个线程处于创建状态时,它仅仅是一个空的线程对象,系统不为它分配资源。
2. 可运行状态( runnable )
thread mythread = new thread( );
mythread.start( );
当一个线程处于可运行状态时,系统为这个线程分配了它需的系统资源,安排其运行并调用线程运行方法,这样就使得该线程处于可运行( runnable )状态。需要注意的是这一状态并不是运行中状态(running ),因为线程也许实际上并未真正运行。由于很多计算机都是单处理器的,所以要在同一时刻运行所有的处于可运行状态的线程是不可能的,java的运行系统必须实现调度来保证这些线程共享处理器。
3. 不可运行状态(not runnable)
进入不可运行状态的原因有如下几条:
1) 调用了sleep()方法;
2) 调用了suspend()方法;
3) 为等候一个条件变量,线程调用wait()方法;
4) 输入输出流中发生线程阻塞;
不可运行状态也称为阻塞状态(blocked)。因为某种原因(输入/输出、等待消息或其它阻塞情况),系统不能执行线程的状态。这时即使处理器空闲,也不能执行该线程。
4. 死亡状态(dead)
线程的终止一般可通过两种方法实现:自然撤消(线程执行完)或是被停止(调用stop()方法)。目前不推荐通过调用stop()来终止线程的执行,而是让线程执行完。
今天关于java线程学习日志就讲到这里,更多关于java教程请关注达内武汉IT培训官方网站,或者需要了解武汉达内java培训方面的,可以在线咨询武汉达内教育老师。