多线程(线程间通信-多生产者多消费者问题-JDK1.5解决办法-范例),停止线程,线程中方法的区别,匿名内部类实现多线程,线程总结

来源:互联网 发布:java sleep占用cpu 编辑:程序博客网 时间:2024/05/18 02:29

JDK1.5解决办法-范例,代替以前的同步代码块和同步函数,效率变得更高。

class BoundedBuffer {   final Lock lock = new ReentrantLock();   final Condition notFull  = lock.newCondition();    final Condition notEmpty = lock.newCondition();    final Object[] items = new Object[100];   int putptr, takeptr, count;   public void put(Object x) throws InterruptedException {     lock.lock();//拿到锁     try {       while (count == items.length)          notFull.await();//让线程等待       items[putptr] = x;        if (++putptr == items.length) putptr = 0;       ++count;       notEmpty.signal();     } finally {       lock.unlock();//释放锁     }   }   public Object take() throws InterruptedException {     lock.lock();     try {       while (count == 0)          notEmpty.await();       Object x = items[takeptr];        if (++takeptr == items.length) takeptr = 0;       --count;       notFull.signal();       return x;     } finally {       lock.unlock();     }   }  }

停止线程的方法,后台线程(守护线程):

/*停止线程:1,stop方法。2,run方法结束。怎么控制线程的任务结束呢?任务中都会有循环结构,只要控制住循环就可以结束任务。控制循环通常就用定义标记来完成。但是如果线程处于了冻结状态,无法读取标记。如何结束呢?可以使用interrupt()方法将线程从冻结状态强制恢复到运行状态中来,让线程具备cpu的执行资格。 当时强制动作会发生了InterruptedException,记得要处理*/class StopThread implements Runnable{private boolean flag = true;public synchronized void run(){while(flag){try{wait();//t0 t1}catch (InterruptedException e){System.out.println(Thread.currentThread().getName()+"....."+e);flag = false;}System.out.println(Thread.currentThread().getName()+"......++++");}}public void setFlag(){flag = false;}}class StopThreadDemo {public static void main(String[] args) {StopThread st = new StopThread();Thread t1 = new Thread(st);Thread t2 = new Thread(st);t1.start();t2.setDaemon(true);t2.start();int num = 1;for(;;){if(++num==50){//st.setFlag();t1.interrupt();//t2.interrupt();break;}System.out.println("main...."+num);}System.out.println("over");}}

join方法、yield方法:作为了解。

class Demo implements Runnable{public void run(){for(int x=0; x<50; x++){System.out.println(Thread.currentThread().toString()+"....."+x);Thread.yield();让线程暂停,使其他线程进来}}}class  JoinDemo{public static void main(String[] args) throws Exception{Demo d = new Demo();Thread t1 = new Thread(d);Thread t2 = new Thread(d);t1.start();t2.start();//t2.setPriority(Thread.MAX_PRIORITY);设置线程的优先级//t1.join();//t1线程要申请加入进来,运行。临时加入一个线程运算时可以使用join方法。for(int x=0; x<50; x++){//System.out.println(Thread.currentThread()+"....."+x);}}}






wait 和 sleep 区别?


1,wait可以指定时间也可以不指定。
   sleep必须指定时间。


2,在同步中时,对cpu的执行权和锁的处理不同。
wait:释放执行权,释放锁。
sleep:释放执行权,不释放锁。







class Demo
{


void show()
{
synchronized(this)// 
{
 
wait();//t0 t1 t2

}
}
void method()
{
synchronized(this)//t4
{

//wait();


notifyAll();


}//t4
}
}








class  
{
public static void main(String[] args) 
{
System.out.println("Hello World!");
}
}


匿名内部类实现多线程,面试题:

/*class Test implements Runnable{public void run(Thread t){}}*///如果错误 错误发生在哪一行?错误在第一行,应该被abstract修饰class ThreadTest {public static void main(String[] args) {new Thread(new Runnable(){public void run(){System.out.println("runnable run");}}){public void run(){System.out.println("subThread run");}}.start();/*匿名内部类实现多线程的方式new Thread(){public void run(){for(int x=0; x<50; x++){System.out.println(Thread.currentThread().getName()+"....x="+x);}}}.start();for(int x=0; x<50; x++){System.out.println(Thread.currentThread().getName()+"....y="+x);}Runnable r = new Runnable(){public void run(){for(int x=0; x<50; x++){System.out.println(Thread.currentThread().getName()+"....z="+x);}}};new Thread(r).start();*/}}



package src;/*多线程总结:1,进程和线程的概念。|--进程:|--线程:2,jvm中的多线程体现。|--主线程,垃圾回收线程,自定义线程。以及他们运行的代码的位置。3,什么时候使用多线程,多线程的好处是什么?创建线程的目的?|--当需要多部分代码同时执行的时候,可以使用。4,创建线程的两种方式。★★★★★|--继承Thread|--步骤|--实现Runnable|--步骤|--两种方式的区别?5,线程的5种状态。对于执行资格和执行权在状态中的具体特点。|--被创建:|--运行:|--冻结:|--临时阻塞:|--消亡:6,线程的安全问题。★★★★★|--安全问题的原因:|--解决的思想:|--解决的体现:synchronized|--同步的前提:但是加上同步还出现安全问题,就需要用前提来思考。|--同步的两种表现方法和区别:|--同步的好处和弊端:|--单例的懒汉式。|--死锁。7,线程间的通信。等待/唤醒机制。|--概念:多个线程,不同任务,处理同一资源。 |--等待唤醒机制。使用了锁上的 wait notify notifyAll.  ★★★★★|--生产者/消费者的问题。并多生产和多消费的问题。  while判断标记。用notifyAll唤醒对方。 ★★★★★|--JDK1.5以后出现了更好的方案,★★★Lock接口替代了synchronized  Condition接口替代了Object中的监视方法,并将监视器方法封装成了Condition和以前不同的是,以前一个锁上只能有一组监视器方法。现在,一个Lock锁上可以多组监视器方法对象。可以实现一组负责生产者,一组负责消费者。 |--wait和sleep的区别。★★★★★8,停止线程的方式。|--原理:|--表现:--中断。9,线程常见的一些方法。|--setDaemon()|--join();|--优先级|--yield();|--在开发时,可以使用匿名内部类来完成局部的路径开辟。 class  {public static void main(String[] args) {System.out.println("Hello World!");}}*/





0 0