java--线程
多任务处理的两种类型
1.基于进程:
进程是指一种“自包容”的运行程序,由操作系统直接管理,直接运行,有自己的地址空间,每个进程一开启都会消耗内存。
特点是允许计算机同时运行两个或多个程序。
2.基于线程:
线程是指进程内部单一的顺序控制流。一个进程拥有多个线程,多个线程共享一个进程的内存空间。
基于线程的多任务处理环境中,线程是最小的处理单位。
主线程: main方法一运行,就开启主线程。
特点:
1.最先开始。
2.最后结束。
3.产生其他的子线程。
4.回收资源。
线程类:Thread Thread.sleep(500),程序休眠500毫秒再执行。
创建和启动Thread线程:
1.声明一个Thread类,并覆盖run()方法,
class Thread1 extends Thread{
public void run(){ //覆盖该方法 }
} //当一个子类同时重写run(),start()时,优先调用start();
................................................................................
Thread1 t1=new Thread1();
t1.start();
2.声明一个实现Runnable接口的类,并实现Run()方法
class R implements runnable{
public void run(){ //实现该方法 }
}
启动线程,调用start()就会执行run();
.........................................................
R r=new R();
Thread t2=new Thread(r);
t2.start();
创建线程时,传入runnable实现类对象,那么线程启动时,会执行该对象的run();
在线程中调用start和run的区别:
1.如果直接调用run方法是普通的方法调用,不会在主线程的基础上开启子线程,是单线程。
2.调用start,会在主线程的基础上开启子线程,多个任务同时执行。
线程优先级:
当两个或以上的线程同时处于就绪状态,等待CPU执行,优先级高的线程会优先执行, setPriority(10) ---->设置线程优先级,10最高,1最低,5默认。
守护线程/精灵线程/后台线程
t2.setDaemon(true) 别的线程结束,守护线程就结束。
Thread.join
把指定线程加入到当前线程,在 B中调用A的join方法,知道A执行完时才执行B
线程同步(线程安全)
当两个及以上的线程同时操作一个资源时,别的线程只能等待,当该线程结束对该资源的访问时,才允许别的线程访问。
同步造成的结果:1.数据安全 2.效率低下
同步有两种方法:
1.同步方法:
public synchronized void test(){}
2.同步快:
public voidrun(){
synchronized(obj)
}
wait和sleep的区别:
1.sleep方法在线程类Thread中定义,with方法在object中定义;
2.with只能放在同步方法或同步块中,表示当前线程对资源进行进行等待,sleep方法可以放在任何位置,表示当前线程睡眠;
3.with方法要释放对象锁,sleep方法不会释放对象锁。
4.with方法使用后,线程需要notify唤醒后才能继续执行,sleep方法休眠结束后线程自动继续执行。