进程 and 线程
进程是程序的一次动态执行过程。经历了从代码加载、执行到执行完毕的一个完整过程;(由于CPU的执行速度很快,使得所有的进程像是“同时”执行一样)
多线程是实现并发机制的一种有效手段。线程是比进程更小的执行单位,多线程是指一个进程在执行过程中可以产生多个更小的程序单元(即线程),这些线程可以同时存在、同时运行,而一个进程包含了多个同时执行的线程.
Java中线程的实现
所谓的线程(Thread)是指程序的运行流程,多线程的机制则是指可以同时运行多个程序块,使程序的运行效率更高.
Java中,实现多线程代码有两种方式:一是继承Thread类;二是实现Runnable接口(JDK1.5之后提供有一个新的Callable接口)
继承Thread类:
一个类只要继承了Thread类,此类就称为多线程操作类。在Thread子类中,必须明确的覆写Thread类中的run()方法。此方法为线程的主体.
演示:
class MyThread extends Thread{ private String name; public MyThread(String name){ this.name=name; } public void run(){ for(int i=0;i<=10;i++) System.out.println(name+"运行"+"\t"+"i="+i); } } public class ThreadDemo { public static void main(String[] args) { MyThread m1=new MyThread("线程A"); MyThread m2=new MyThread("线程B"); m1.run(); m2.run(); } }
此时会发现控制台打印的结果并没有交替打印,要想启动线程,是不能直接调用run()方法的.
而是应该调用从Thread类中继承而来的start()方法. 改:
m1.run() --- m1.start()
m2.run()---m2.start()
此时就会交替打印,但每次结果可能不同——哪个线程对象抢到了CPU资源,哪个线程就先运行
实现Runnable接口:
Thread类和Runnable接口的区别
线程的状态
要想实现多线程,必须在主线程中创建新的线程对象。线程一般有5中状态:创建、就绪、运行、阻塞、终止.
1. 创建状态:
在程序中用构造方法创建了一个线程对象后,新的线程对象便处于新建状态。此时,它已经有了相应的内存空间和其他资源,但还处于不可运行状态。新建一个线程对象可采用Thread类的构造方法实现,例如:Thread thread = new Thread();
同步与死锁
所谓的同步,是指多个操作在同一时间段内只能有一个线程进行,其他线程要等此线程完成之后才可以进行。
使用同步解决问题:
解决资源共享的同步操作,可以使用同步代码块和同步方法两种方式完成.
1、同步代码块: 代码块是指使用{}括起来的一段代码,根据其位置和声明的不同,可以分为普通代码块、构造块、静态块3种,如果在代码加上synchronized关键字,则此代码称同步代码块
死锁:
一般程序的死锁是在程序运行时出现的.
读者需要记住:多个线程共享同一资源时,需要同步;但是,过多的同步可能造成死锁