多进程:在操作系统中能运行多个任务。
多线程:在同一个应用程序中有多个顺序流执行。
两者区别:进程拥有自己完整的变量,线程则共享相同的数据。
JVM有一个主线程,启动Java程序则启动他,并调用程序的main()方法,多线程是通过虚拟CPU实现,通过java.lang.Thread类实现,继承Thread类。
构造方法:
Thread()
Thread(Runable target)
Thread(Runable target,String name)
启动线程用run()方法,自动调用。
start()进入可运行状态,通过“.”来调用。
1.实现Runable接口定义唯一的run()方法。
Class rt = new Class();
Thread t = new Thread(rt);
t.start();
2.继承Thread类。
Thread t = new Thread();
t.start();
两者的区别:
1.Runable 可以从其他类继承,保持程序风格一致性。
2.Thread 不能再从其他类继承。
结束线程:
1.run()方法执行完毕。
2.抛出一个异常或错误。
3.调用一个Deprecated的stop()方法。(过时)
后台线程为其他线程提供服务,优先级最低,级别0-10,默认级别为5。
如:Thread dt = new Thread();
dt.setDaemon(true); //设置成后台线程
dt.start();
线程控制:
测试线程是否处于Runable状态 isAlive()方法。
中断线程
Thread.sleep()中断时间以毫秒为单位。
Thread.yield()放弃执行,执行不低于此线程的其他线程。
设置线程的优先级
getPriority() 获取
setPriority() 设置
对象方法
wait()处于等待状态,等待被唤醒。
notify()/notifyAll() 唤醒线程/所有线程。
join()调用这个方法主线程,等待加入子线程完成。
异常为 InterruptedException e 。
Thread.currentThread().isAlive(); // 获取当前线程是否处于Runable状态
Thread.currentThread().getName(); //获取当前线程的名字
互斥锁:保证共享数据的完整性。每个对象对应一个标记,保证在任一时刻,只能有一个线程访问该对象,使用synchronized关键字修饰。放在方法、对象、块前。
释放锁用break,return或抛出exception自动释放;调用wait()方法将放弃拥有的对象锁。
如:public void method() {
synchronized(obj) {
}
}
等同于
public synchronized void method() {
}
死锁:两个线程都在等待对象锁,不可避免。