多线程:就是进程的扩展,实现并发。一个进程可以包含多个线程,进程一般是由操作系统控制,而线程就是由程序员控制的,所以作为编程人员做好线程是我们的重点。
线程和进程一样分为五个阶段:创建、就绪、运行、阻塞、终止。
进程是操作系统同时执行多个任务,其实也不是同时执行,就是把多个任务分成就绪、运行-->就绪、运行切换,CPU执行速度太快,所以感觉是同时执行。
多线程是指在同一程序中有多个顺序流在执行,从而实现并发性。
创建线程有两种方法:继承Thread;实现Runnable接口;通过匿名内部类实现Runnable接口
1.继承Thread,然后重写run()方法,再然后就是启动线程.start().
Class Thread1 extends Thread{
@Override
public void run() {}
}
2.实现Runnable接口,然后重写run()方法,再然后就是启动线程.start().
Class Thread2 implements Runnable{
@Override
public void run() {}
}
Thread2 th=new Thread2();
Thread th1=new Thread(th);//创建线程对象
th1.start();//启动线程
3.通过匿名内部类实现Runnable接口,然后在匿名内部类中重写run()方法,再然后就是启动线程.start().
Thread th=new Thread(new Runnable(){
@Override
public void run() {}
});
线程休眠
Thread.sleep(500);//500表示500毫秒
Thread.currentThread().getName()//获得线程默认的名字
Thread.currentThread().SetName("th1")//设置线程名
Thread和Runnable的区别
1.如果一个类继承Thread,则不适合资源共享。但是如果实现了Runnable接口的话,则很容易的实现资源共享。
继承Thread 创建的对象是单独的线程,而实现Runnable其实是同一个线程。
2.实现Runnable接口比继承Thread类的优势:
1):适合多个相同的程序代码的线程去处理同一个资源
2):可以避免java中的单继承的限制
3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立
为了不让同一个对象不被多个线程同时访问,引入锁的概念(Synchronized),加锁之后当这个对象被线程1访问就会上锁,之后的线程想访问只能等线程1访问结束。引入锁保证了安全性。