之前一直以为多线程自己学的还不错,最近找工作面试的时候还是被多线程问题给难住了。关键自己虽说学了,但是没上心,没把多线程问题研究透。今天乘自己有空,在把JAVA多线程这一块好好研究一下,避免下次面试时再犯同样的错误。当然,接下来关于多线程的介绍也主要摘自网上博客。《JAVA多线程编程详解 》以及《Java多线程编程总结 》
线程的概念:
多线程允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立。它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进程简单。
具体到java内存模型,由于Java被设计为跨平台的语言,在内存管理上,显然也要有一个统一的模型。系统存在一个主内存(Main Memory), Java中所有变量都储存在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存(Working Memory),工作内存中保存的是主存中某些变量的拷贝,线程对所有变量的操作都是在工作内存中进行,线程之间无法相互直接访问,变量传递均需要通过主存完成。
多个线程的执行是并发的,也就是在逻辑上“同时”,而不管是否是物理上的“同时”。如果系统只有一个CPU,那么真正的“同时”是不可能的。“同时”执行是人的感觉,在线程之间实际上轮换执行。多线程和传统的单线程在程序设计上最大的区别在于,由于各个线程的控制流彼此独立,使得各个线程之间的代码是乱序执行的,将会带来线程调度,同步等问题。
JAVA实现多线程
JAVA实现多线程主要有两种方法:实现java.lang.Runnable接口、继承java.lang.Thread类。
方法一:继承 Thread 类,重写方法 run(),我们在创建的 Thread 类的子类中重写 run() ,加入线程所要执行的代码即可。由于类的继承只有一个,所以当前类已经继承其他类的情况下就不能再继承Thread类。
方法二:实现 Runnable 接口。Runnable 接口只有一个方法 run(),我们声明自己的类实现 Runnable 接口并提供这一方法,将我们的线程代码写入其中,就完成了这一部分的任务。但是 Runnable 接口并没有任何对线程的支持,我们还必须创建 Thread 类的实例,这一点通过 Thread 类的构造函数public Thread(Runnable target);来实现。
(转载)