
--------- android培训,java培训,期待与您的交流! ----------
与使用同步方法和语句相比,Lock()实现提供了更广泛的锁定操作.
private Lock lock = new ReentrantLock();
锁定的代码应包含在lock.lock()lock.unlock()中. 哪个使用try. . . 终于被包围了
同步: 低效率. 如果发生同步嵌套,则会发生死锁. 但是安全.
死锁问题: 当两个或多个线程争用资源时,会出现互相等待的现象
线程间通信,不同类型的线程在同一资源上运行.
多个线程也可能具有相同的数据多次出现,或者输出不匹配. 都属于线程安全问题.
等待唤醒机制

在Object类中,wait()等待notify()唤醒单个线程notifyAll()唤醒所有线程
这些方法调用必须通过锁对象调用. 我们刚刚使用的锁定对象是任意锁定对象.
wait()被try catch包围,并唤醒notify()解决死锁
也就是说,在运行()中判断条件. 如果已建立,则该锁称为wait(). 如果未建立,则更改锁的判断条件多线程如何避免死锁,然后调用notify()唤醒.
运行状态图:


线程组: 默认情况下为主线程组
getThreadGroup()获取线程组
Thread.currentThread(). getThreadGroup(). getName();返回线程组的名称.
更改线程组
首先创建一个线程组: ThreadGroup tg = new ThreadGroup(“这是一个新的线程组”);
然后线程t1 =新线程(tg,Myrunnale,“线程名称”);
通过线程组名称设置后台线程,并使用tg.setDaemon()设置守护线程. 等等
线程组主要用于线程的统一管理.
也可以在类中进行同步,将相应的方法设置为同步. 请注意,方法中的锁定对象是这个
线程池: 启动程序的新线程的成本相对较高,因为它涉及与操作系统的交互. 其次,使用线程池可以提高性能,尤其是在程序中创建大量生命周期时. 使用短线程时多线程如何避免死锁,应考虑使用线程池.
线程池在每个线程结束后不会被破坏,而是返回到线程池并变为空闲状态.
staticExecutorService
newCachedThreadPool()
创建一个线程池,该线程池可以根据需要创建新线程,但是在可用之前重用以前构造的线程.

staticExecutorService
newFixedThreadPool(intnThreads)
创建一个可以重用固定数量的线程的线程池,并在共享的无界队列中运行这些线程.
staticExecutorService
newSingleThreadExecutor()
创建一个执行程序,该执行程序使用单个工作线程在无限制的队列中运行该线程.
A: 创建一个线程池对象并控制要创建多少个线程对象
ExecutorServoce newFixedThreadPool(int nThread)
B: 该线程池的线程可以执行:
可以执行Runnable对象或CallAble对象表示的线程
成为可运行的界面
C: 只需调用以下方法:
未来<?>提交(可运行任务)
NewFixedThreadPool静态函数,直接调用

1 ExecutorService pool=Executors.newFixedThreadPool(2); 2 pool.submit(new MyRunnable);
结束线程池: pool.shutdown();创建多线程模式3:
Callable是一个接口. 该线程具有返回接口,但可运行不返回任何结果. 类似于可运行的用法
他通过线程池创建线程. 这种不常见的Future表示提交异步计算的结果. 它提供了一种检查计算是否完成,等待计算完成并获得计算结果的方法. 计算完成后,您只能使用get方法获取结果. 如有必要,可以在计算完成之前阻止此方法. 取消通过cancel方法执行. 麻烦,通常不需要. 匿名内部类使用多个线程“
1 //集成Thread类来实现多线程 2 new Thread(){ 3 public void run() { 4 for (int i = 0; i < 100; i++) { 5 System.out.println(Thread.currentThread().getName()+":"+i); 6 } 7 }; 8 }.start(); 9 //用Runnable接口实现 10 new Thread(new Runnable() { 11 12 @Override 13 public void run() { 14 // TODO Auto-generated method stub 15 for (int i = 0; i < 100; i++) { 16 System.out.println(Thread.currentThread().getName()+":"+i); 17 } 18 } 19 }){}.start();
但是对于子类别,它将输出世界,而不是你好
1 new Thread(new Runnable() { 2 3 @Override 4 public void run() { 5 // TODO Auto-generated method stub 6 for (int i = 0; i < 100; i++) { 7 System.out.println("hello"+":"+i); 8 } 9 } 10 }){ 11 public void run() { 12 for (int i = 0; i < 100; i++) { 13 System.out.println("world"+":"+i); 14 } 15 }; 16 }.start();
计时器: 在指定的时间做某事或重复某件事
Timer是线程可以用来计划将来在后台线程中执行的任务的工具. 该任务可以安排为一次执行,也可以定期重复. </ p>
依靠Timer和TimerTask两类
计时器
TimerTask: 任务构造方法摘要
计时器()
创建一个新计时器.
计时器方法

取消()
终止此计时器并放弃所有当前计划的任务.
清除()
从此计时器的任务队列中删除所有已取消的任务.
时间表(TimerTasktask,日期时间)
计划在指定的时间执行指定的任务.
时间表(TimerTasktask,DatefirstTime,长周期)
安排指定任务在指定时间开始重复执行固定延迟.
时间表(TimerTasktask,长延迟)
计划在指定的延迟后执行指定的任务.
时间表(TimerTasktask,longdelay,longperiod)
安排指定任务在指定延迟后开始重复执行固定延迟.
scheduleAtFixedRate(TimerTasktask,DatefirstTime,长周期)
安排指定任务在指定时间开始重复执行固定速率.
scheduleAtFixedRate(TimerTasktask,longdelay,longperiod)
安排指定的任务在指定的延迟后开始重复执行固定速率的操作.
面试问题
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-225767-1.html
抵近巡逻是样子
mo