1.Java线程基本概念
在操作系统中两个比较容易混淆的概念是进程(process)和线程(thread)。操作系统中的进程是资源的组织单位。进程有一个包含了程序内容和数据的地址空间,以及其它的资源,包括打开的文件、子进程和信号处理器等。不同进程的地址空间是互相隔离的。而线程表示的是程序的执行流程,是CPU调度的基本单位。线程有自己的程序计数器、寄存器、栈和帧等。引入线程的动机在于操作系统中阻塞式I/O的存在。当一个线程所执行的I/O被阻塞的时候,同一进程中的其它线程可以使用CPU来进行计算。这样的话,就提高了应用的执行效率。线程的概念在主流的操作系统和编程语言中都得到了支持。
一部分的Java程序是单线程的。程序的机器指令按照程序中给定的顺序依次执行。Java语言提供了java.lang.Thread类来为线程提供抽象。有两种方式创建一个新的线程:一种是继承java.lang.Thread类并覆写其中的run()方法,另外一种则是在创建java.lang.Thread类的对象的时候,在构造函数中提供一个实现了java.lang.Runnable接口的类的对象。在得到了java.lang.Thread类的对象之后,通过调用其start()方法就可以启动这个线程的执行。(网上抄的)
2.实现线程的两种方式
实现线程有两种方式,
1.继承Thread类
public class ThreadTest extends Thread { public static void main(String[] args) { ThreadTest tt = new ThreadTest(); tt.start(); } @Override public void run() { System.out.println(Thread.currentThread().getName()); } }
运行输出:Thread-0
注意,如果调用tt.run();也会运行,但是这就只是个普通的方法了,并没有开启线程。
2.实现Runnable方法
public class RunnableTest implements Runnable { public static void main(String[] args) { RunnableTest rt = new RunnableTest(); Thread t = new Thread(rt); t.start(); } public void run() { System.out.println(Thread.currentThread().getName()); } }
输出:Thread-0
3.线程状态
一个线程可以处于以下四种状态之一:
1)新建(new):当现场被创建时,它只会短暂的处于这种状态,此时它已经分配了必需的系统资源,并执行了初始化,此刻线程已经有资格获取cpu时间了,之后调度器将把这个线程转变为可运行状态或阻塞状态。
2)就绪(Runable):在这种状态下,只要调度器将时间片分给这个线程,线程就可以运行。也就是说,在任意时刻线程可以运行也可以不运行。只要调度器能分配时间片给线程,他就可以运行;这不同于死亡和阻塞状态。
3)阻塞(blocked):线程能够运行,但是有个条件阻止他运行。当线程处于阻塞状态时,调度器将忽略线程,不会分给cpu任何时间。直到线程重新进入就绪状态他才有可能执行操作
4)死亡(Dead):处于死亡或者终止状态的线程将不再是可调度的,并且再也不会得到cpu时间,它的任务已结束,或不再是可运行的。任务死亡通常的方式是从run()方法返回,但是任务的线程还可以被中断
(摘抄自java编程思想)