------ <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ---
1.线程就是一个串行执行的程序流,多线程就是指一个程序同时又多个线程在执行,彼此平行。
2.一个java程序至少有2个线程,一个main(),一个垃圾回收器。获得当前线程对象的应用:this.currentThread()
3.线程的运行状态:新建:主线程调用了start()但还没轮到
运行:正在执行
冻结:sleep(time),wait()—notify()唤醒;
线程释放了执行权,同时释放执行资格;
临时阻塞状态:线程具备cpu的执行资格,没有cpu的执行权;
消亡:stop() run方法结束
(1)继承Thread类,实现run()方法,run方法中的代码就是
子线程的代码。在主线程中,
MyThread th=new MyThread();
th.start(); //启动子线程
(2)实现Runnable接口,同样是要实现run()方法
在主线程中:
Thread th2=new Thread(new MyRunnable());
th2.star();
(3)Executors类创建线程或线程池
a.定时器<pre name="code" class="java">Executors.newScheduledThreadPoo(1).scheduleAtFixedRate(
new Runnable() {
@Override
public void run() {
//子线程代码
}
},int initialDelay,int period,TimeUnit);
//initialDelay:第一次执行的延迟时间
//period:执行周期
//TimeUnit:时间单位,枚举
b。单个子线程
Executors.newSingleThreadExecutor().execute(
new Runnable(){
@Override
public void run() {
//子线程代码
}
}
5.多线程安全
(1)有些语句块在执行的时候不能被中断,否则会造出错误,
这称为原子性。当多条线程同时访问一个对象的数据时,
应该让一个线程访问完,才能让另一线程访问。
这可以通过synchronized语句
synchronized(Object){
//需要被同步的代码
}
对象如同锁,只有获得锁的对象才能访问相应的代码
(2)同步函数public synchronized void function(){}
6.当2个线程相互等待 对方已被锁定的资源,就会发生死锁的
问题。避免死锁的一个通用的经验法则是:当几个线程都要访问共享资源A、B、C时,保证使每个线程都按照同样的顺序去访问它们,比如都先访问A,在访问B和C。
(1)调整线程的优先级th.setPriority(int),共有10级。
(2)某线程中调用sleep()或sleep(int time)进入睡眠状态,并把执行权让给其他的线程。
(3)线程让步th.yield()
(4)一个线程调用另一个线程的join(),一直等到另一线程执行完它才恢复执行。
这3个函数用在加锁的代码块中。
(1)线程执行wait()时,会释放对象的锁,并被jvm放入到该对象的等待池中,等待其他对象将他唤醒。
(2)当代码结束的时候,应该调用notifyAll()唤醒其他因为等待锁而处于阻塞状态的线程。
(3)notify()随机唤醒一个对象等待池中的线程,用的很少,一般用notifyAll()
------ <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ---