---------------------
等待唤醒机制: 图解
* public final void wait() throws InterruptedException
* public final void wait(long timeout) throws InterruptedException
* public final void wait(long timeout, int nanos) throws InterruptedException
* 上面3个方法的作用是让当前线程对象等待,需要通过 notify()方法或 notifyAll()方法进行唤醒
* 当调用该方法后,会释放当前线程对象上的 锁对象, 同时,释放CPU执行权
* Synchronzied (p) {
* ....
* p.wait(); /将某个线程等待
* ...
* }
*
* public final void notify()
* 唤醒当前锁对象上 处于等待状态的线程
* 如果当前锁对象上 有多个线程处于等待状态,会随机唤醒其中的一个线程
*
* public final void notifyAll()
* 唤醒当前锁对象上 处于等待状态的线程
* 如果当前锁对象上 有多个线程处于等待状态, 会唤醒所有处于等待状态的线程
----------------------
Java中使用ThreadGroup来表示线程组,它可以对一批线程进行分类管理,Java允许程序直接对线程组进行控制。
默认情况下,所有的线程都属于主线程组。
public final ThreadGroup getThreadGroup()
我们也可以给线程设置分组
//获取线程池中的线程,调用Callable接口子类对象中的call()方法, 完成求和操作
//<Integer> Future<Integer> submit(Callable<Integer> task)
// Future 结果对象
Future<Integer> result = threadPool.submit(c);
//此 Future 的 get 方法所返回的结果类型
Integer sum = result.get();
使用线程池中线程对象的步骤:
创建线程池对象
创建Runnable实例对象
提交Runnable实例
关闭线程池
--------------------------
匿名内部类方式使用多线程
new Thread(){代码…}.start();
new Thread(new Runnable(){代码…}).start();
new Thread(){
@Override
public void run() {
System.out.println("haha");
}
}.start();
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("heihei");
}
}).start();
--------------------------
Timer: 时钟类
public Timer()
public void schedule(TimerTask task, long delay)
当给定的延迟时间达到后,执行 时钟任务类中的代码
public void schedule(TimerTask task,long delay,long period)
当给定的延迟时间 delay 达到后,执行 时钟任务类中的代码
然后再等指定的时间 period 达到后,重复的执行 时钟任务类中的代码
TimerTask 时钟任务类
public abstract void run()
public boolean cancel()
----------------------------
1, 多线程有几种实现方案,分别是哪几种?
a, 继承Thread类
b, 实现Runnable接口
c, 通过线程池,实现Callable接口
2, 同步有几种方式,分别是什么?
a,同步代码块
b,同步方法
静态同步方法
3, 启动一个线程是run()还是start()?它们的区别?
启动一个线程是start()
区别:
start: 启动线程,并调用线程中的run()方法
run : 执行该线程对象要执行的操作