java多线程常用方法
线程 、进程
- 程序 : 是可以执行的文件.
- 进程 : 正在内存中执行的程序.
- 线程 : 一个进程中的若干子任务, 这些任务是并发的, 同时运行的. 线程可以直接被CPU执行.
创建并启动线程的方式:
1. 实现的方式 : Runnable接口(可被子线程运行的)
- 写一个具体类, 实现Runnable接口, 并实现接口中的抽象方法run
- 在主方法中创建这个具体类对象, 并以这个对象为实参创建Thread线程对象, Thread对象才是真正的线程对象
- 调用Thread线程对象的start()
2. 继承的方式 创建线程的第二种方式 :
-
- 写一个具体类, 继承Thread, 并要重写run方法.
-
- 创建这个具体类对象, 相当于创建了线程对象
-
- 调用这个对象的start方法.
-
sleep阻塞的解除 2种方式
- 睡眠时间到了, 自动醒
- 被别的线程调用本线程的interrupt方法
Thread常用方法
public String getName() :获取当前线程名称。
public void start() :导致此线程开始执行; Java虚拟机调用此线程的run方法。
public void run() :此线程要执行的任务在此处定义代码。
public static void sleep(long millis) :使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行)。
public static Thread currentThread() :返回对当前正在执行的线程对象的引用。
static void yield() 线程让步,暂停当前正在执行的线程,把执行机会让给其他优先级相同或更高的线程
public void join() 当某个程序执行流中调用其他线程的join方法是,当前调用者线程将被阻塞,直到join方法加入的join线程执行完为止.
public boolean isAlive(e lai wu)() 判断线程是否还存活
public void interrupt() 这一方法实际完成的是,给受阻塞的线程发出一个中断信号,这样受阻线程就得以退出阻塞的状态。
更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,此时调用该线程的interrupt(in te rua pe te)方法,
那么该线程将抛出一个 InterruptedException中断异常(该线程必须事先预备好处理此异常),从而提早地终结被阻塞状态。如果线程没有被阻塞,
这时调用 interrupt()将不起作用,直到执行到wait(),sleep(),join()时,才马上会抛出 InterruptedException。
public static boolean interrupted(in te rua pe te d)获取线程运行状态
public final void setDaemon(de men) 设置该线程为守护线程,守护线程,当程序中最后一个非守护线程退出时,守护线程随jvm一同结束工作
Object的三个常用线程方法
- wait() : 令当前线程挂起并放弃CPU、同步资源, 使别的
线程可访问并修改共享资源, 而当前线程排队等候再次
对资源的访问 - notify() : 唤醒正在排队等待同步资源的线程中优先级最
高者结束等待 - notifyAll(): 唤醒正在排队等待资源的所有线程结束等待,
- java.lang.Object提供的这三个方法只有在synchronized 方法或synchronized 代码块中才能使用, 否则会报java.lang.illegalMonitorStateException异常
线程同步解决线程不安全问题
1. 同步代码块
同步代码块: synchronized 关键字可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。格式:
synchronized(同步锁){
需要同步操作的代码
}
同步锁,一个锁的概念
1. 在括号中写上一个锁对象,可以是任意类型
2. 多个线程都要使用同一把锁,保证锁的唯一
2. 同步方法
同步方法:使用synchronized修饰的方法,就叫做同步方法,保证A线程执行该方法的时候,其他线程只能在方法外等着。
public synchronized void method(){
可能会产生线程安全问题的代码
}
使用的锁对象
对于非static方法,同步锁就是this。
对于static方法,我们使用当前方法所在类的字节码对象(类名.class)。
3.Lock锁
提供了比synchronized代码块和synchronized方法更广泛的锁定操作,
同步代码块/同步方法具有的功能Lock都有,除此之外更强大,更体现面向对象。
线程的优先级
MAX_PRIORITY(10);
MIN_PRIORITY(1);
NORM_PRIORITY(5);
涉及的方法:
getPriority() 返回线程优先级
setgetPriority(int newPriority) 改变线程的优先级