JAVA线程学习笔记

来源:互联网 发布:工业产品网络推广 编辑:程序博客网 时间:2024/05/29 11:41
JAVA提供对线程的支持主要有两种,一个是继承类Thread
,另外一个则是实现接口Runable.
上述两者的实现方法都很简单,只需要覆盖run方法即可.
例如:


class MyThread extends Thread{
public void run(){
System.out.println("自定义线程只需


要重写这个run方法");
}


}


同理,


class MyRunable implements Runable{
public void run(){
System.out.println("自定义


runable接口需要重写该方法");
}
}




但是在 实例化 一个线程的时候,自定义的Thread 和自定


义的Runable 两者有些区别:
例如: Thread th=new MyThread();
     Thread th2=new Thread(new MyRunable


(),"myrun");//需要传入一个Runable参数,参数二是一个


字符串,是指该线程的名字;


好的 .
接下来,我们来看看如何启动一个线程:
th.start();
th2.start();


其实线程还有相关的方法供我们调用:
Thread.Sleep();//使线程休眠
Thread.join();//可以使得其它线程等待当前线程执行完


毕.也就是说,当前线程执行完之后,才可以执行其他线程.
Thread.yield();//使得线程释放处理器资源,所有线程重


新争夺处理机
Thread.curentThread();//获取当前线程




如何推出线程:
千万不要使用stop()这个方法,这个方法是一个错误的方


法,因为它会使得我们的线程戛然而止,我们不知晓线程执


行到哪里,更没有办法做一些相关的清理操作.


退出线程的最好方法,使用退出标志.


什么是退出标志?
请看例子:
class MytThread extends Thread{
volatile boolean keepRunning=true;
//  必须加上volatile标识,原因下面会说.


public void run(){
while(keepRunning){
//这里是你线程需要做的事情
}
}
}


上面的keepRunning 就是上文所说的退出标识;
我们将keepRunning初始化为true;
那么线程在其他地方调用start()后,就可以执行相关操作
然后,当我们需要停止线程时候,我们只需要将


keepRunning设置为false即可;
这时候线程就可以安全的停止;
由于我们是在其他地方将keepRunning设置为false的.
这个"其他地方"的准确含义是指其它线程.
为了保证不同线程读取这个keepRunning的标识不会出错.
所以必须将它设置为volatile.


下面将会说说线程的互斥和同步:


举例子:
class MyThread extends Thread{
private final Object locObj=new Object();
//注意这里定义为Object


public void run(){

synchronized(locObj){
while(条件不成立){
locObj.wait();//阻塞线程
}
/*这里是相关代码*/


locObj.notifyall();//唤醒线程
}
}
}


整一个线程的互斥操作的执行流程:
1.首先线程要先争夺到锁,这把锁就是locObj,当某一线程


争夺到锁后,其它线程就没有办法拿到锁.
2.争夺到锁的线程假如条件不成立,就会被阻塞.并且释放


掉锁.然后其它线程重新争夺这把锁.
3.争夺到锁的线程假如顺利地执行完毕,就会唤醒其它线


程,重新争夺这把锁.



上面加锁的方式只可以同一时间有一人使用,要想控制同一时间,限定若干人次来访问,可以采取信号灯机制,java有提供相关api



要想实现同一时间控制若干人次同时访问某一个函数,不仅可以使用信号灯,还可以使用线程池.




ThreadPoolExecutor threadPoolExecutor=
new ThreadPoolExecutor(5, 10, 1, TimeUnit.SECONDS,
new LinkedBlockingQueue< Runnable >(100),
new ThreadFactory() {

AtomicInteger atomicInteger=new AtomicInteger(0);

@Override
public Thread newThread(Runnable r) {
// TODO Auto-generated method stub

return new Thread(r,"Thread"
+atomicInteger.getAndIncrement());
}
});
threadPoolExecutor.execute(new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
//这里编写你要执行的函数
}
});

0 0
原创粉丝点击