一、线程的概念
本人的猜想和思考,也许有误区,参考即可)
在使用没有中断嵌套机制的单片机时,如51。
预计实现如下中断嵌套:
实际执行过程:
就是说,程序直接从第三极跳回了主程序,并没有返回第二级,再由第二级返回主线程。
猜想:
第三级程序执行完成后,第二级程序的运行环境(变量,指令)丢失,裸跑的芯片只保存了主程序的运行环境。
保守结论:引入操作系统后,一个很重要的功能就是任务的调度,保存了各个进程和线程的状态,实现了轮转运行。
2、Java线程的概念
进程是指系统中运行的程序,每个进程有自己独立的内存空间。同时,一个进程也可以启动多个线程。线程简单的理解就是一个进程中不同的执行路径。虽然进程是“同时”的,但是实际执行是轮转运行的,一个时刻,只能有一个任务在运行,只是因为执行的时间很多,给人以同时的感觉。
用户线程和 守护线程,在Java中比较特殊的线程是被称为守护(Daemon)线程的低级别线程。这个线程具有最低的优先级,用于为系统中的其它对象和线程提供服务。
将一个用户线程设置为守护线程的方式是在线程对象创建之前调用线程对象的setDaemon方法。参考:http://walsh.iteye.com/blog/336474。
典型的守护线程例子是JVM中的系统资源自动回收线程,我们所熟悉的Java垃圾回收线程就是一个典型的守护线程,当我们的程序中不再有任何运行中的Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程是Java虚拟机上仅剩的线程时,Java虚拟机会自动离开。它始终在低级别的状态中运行,用于实时监控和管理系统中的可回收资源。守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。也就是说守护线程不依赖于终端,但是依赖于系统,与系统“同生共死”。参考:。
二、创建与启动
创建线程有两中方法,第一种是继承Thread类,第二种是实现Runnable接口,两种方法都需要重写run()方法,实现自己的操作。
继承Thread方法:
eg1
class myThread extends Thread{
@Override
public void run() {
System. out.println( "mythread");
}
}
public class test4 {
public static void main(String[] args){
while( true){
new myThread().start();
}
}
}
实现Runnable方法:
eg2
class myThread2 implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
System. out.println( "mythread2");
}
}
public class test4 {
public static void main(String[] args){
while( true){
new myThread2().run();
}
}
}
两种方法都重写了run()方法,两种方法似乎都继承了同一个接口。同时,如果有两种方法,记着也烦。
打开Thread源码:
打开Runnable源码:
原来这两种方法归根都是实现了Runnable接口,重写了run()方法,了解了这点,我们记忆也方便了很多。这也体现了Java的多态性。
附:Java虽然是静态语言,但是通过多态和绑定也实现了动态的特性。