Java线程

2019-07-19  本文已影响0人  xzz4632

1. 什么是线程?

2. 线程与进程的区别?

3. 如何定义任务?

有三种方式:

3.1 Runnable接口

Runnable接口的实现类本身不具备任何内在的线程能力, 要实现线程行为, 必须将其附着到线程上, 即作为构造参数传给Thread类.

3.2 Thread

Thread类具有线程能力, 调用其start()方法便可以启动一个线程.

3.2.1 start()

启动线程

3.2.2 static void sleep(long millis)

线程会等待指定时间, 此时线程不会释放其已获取的锁.
可通过TimeUnit.XXXX.sleep(long time)方法代替.

3.2.3 setPriority(int priority)

设置线程的优先级, 优先级高的线程具有较高的执行优先权.但这是不确定的. JDK分为1-10共10级. 默认为5.

3.2.4 static void yield();

让出cpu时间给其他线程, 同时该线程也参与争夺cpu时间.

3.2.5 void setDaemon(boolean on)

设置守护线程, 当所有非守护线程运行完成后, 程序才会终止, 守护线程也就运行结束.在线程启动之前设置. 守护线程产生的子线程也是守护线程.
注: 守护线程中的finally块中的语句不会被执行

3.2.6 void join()

等待一个线程完成之后再执行.如调用了t.join(), 则等待t线程执行完成后再执行. 可以指定等待时间.

3.3 Executor

这是一个接口, 用于管理Thread对象, 它在客户端和任务执行之间提供了一个中间层, 将由它来执行任务. 其子接口ExecutorService提供了更多的管理线程的定义. 而Executors类为创建这些Executor提供了一系列便捷的工厂方法.
常用形式如下:

ExecutorService es = Executors.newxxxxThreadPool();
es.execute(runnable);
3.3.1 Executors方法
3.3.2 ExecutorService方法
3.4 Callable

如果要在一个任务完成时能够返回一个值, 则用Callable接口. 且要用ExecutorServicesubmit()方法调用它.

3.4.1 Future接口

4. 捕获异常

由于线程的本质特性, 使得你无法捕获从线程中逃逸的异常, 它会向外传播到控制台. 如你在run方法中抛出一个RuntimeException, 在执行线程时你无法在try-catch块中处理它.

4.1 Thread.UncaughtExceptionHandler

这是一个接口. 为每个线程对象提供一个处理未捕获异常的处理方法.
用法:

注: 也可以在ThreadFactory实现类中统一设置而不必每个线程都这样设置.

5. synchronized

对于并发的处理是通过某种方式来禁止多个任务同时访问同一个资源. 即在资源上加锁, 只有获得这个锁才能访问它, 而每次又只能有一个线程可以持有这个锁.
将共享资源包装到一个对象中, 然后把所有要访问这个资源的方法(普通方法或静态方法)都标记为synchronized. 每次线程调用这些方法时,都将检查锁是否可用, 然后获取锁, 执行代码, 释放锁.
所有的对象都自动地含有单一的锁(也称为监视器).在对象上调用任何synchronized方法都会将此对象加锁. 其他所有要调用类中的synchronized方法的线程都会被阻塞.

5.1 同步规则
5.2 Lock

Lock对象必须被显式地创建, 锁定和释放. 相对于synchronized, 它更加灵活.

Lock lock = new ReentrantLock();
lock.lock;
try {
  .....

} finally {
  lock.unlock;
}

注意: return 语句要放在try块中.

Lock类方法:

5.3 volatile

volatile修饰的变量, 如果对其进行了写操作, 那么所有的读操作都将能看到这个修改. 但是如果变量的值依赖于其之前的值(如递增), 那么用volatile修饰后将无法工作了.

5.4 同步代码块

有时不希望锁住整个方法而只希望锁住部分代码, 则可用如下格式:

// 常用synchronized(this)
synchronized(syncObject) {
  ...
}

这会大大提高方法的执行效率, 因为对象被锁住的时间更短.

6. 结束任务

6.1 线程状态
6.2 进入阻塞状态
6.3 中断
上一篇下一篇

猜你喜欢

热点阅读