`
newjueqi
  • 浏览: 12066 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java线程类小结(附思维导图)

    博客分类:
  • java
阅读更多

【文章标题】Java线程类小结(附思维导图)

【文章作者】曾健生

【作者邮箱】zengjiansheng1@126.com

【作者QQ190678908

【作者博客】http://blog.csdn.net/newjueqi

                     http://newjueqi.iteye.com/

【编程环境】JDK 1.6.0_01

【作者声明】欢迎转载文章,但转载请保留文章的完整性以及注明文章的出处。

 

*******************************************************************************

一.        多线程的意义

1.       原由:两个或两个以上的代码块需要同时运行

2.       创建方法:

a.继承Thread类覆盖run方法

b.实现Runnable接口中的run方法,把实现Runnable接口的子类对象传递给Thread类的构造函数。

 

下面是ab两种方法的代码例子

 

/*

多线程实现的第一种方法,继承Thread

*/

/*

class TestThread extends Thread

{

       public void run()

       {

              while(true)

              {

              System.out.println( "TestThread" );

              }

       }

}

*/

 

/*

多线程实现的第二种方法,实现Runnable接口

*/

class TestThread implements Runnable

{

       public void run()

       {

              while(true)

              {

              System.out.println( "TestThread" );

              }

       }

}

 

 

class BaseThread

{

       public static void main(String ars[])

       {

              //第一种启动多线程的方法

              //new TestThread().start();

             

              //第二种启动多线程的方法

              new Thread( new TestThread()).start();

             

              while(true)

              {

              System.out.println( "main" );

              }

       }

}

 

定义Runnable接口的好处:不需要加入Thread类的继承体系中,如果该类已继承了父类,但需要同时运行多块代码,java为了实现这个功能,暴露了Runnable接口,只要覆盖了其中的run方法,把需要运行的代码写入其中即可,避免了单继承的局限性。

 

下面的代码例子简单的模拟了一下Thread类的设计思想:

/*

演示了多线程两种实现方法的实现机制

*/

 

interface MyRunnable

{

       public void run();

}

 

class MyThread

{

       private MyRunnable mr;

       public MyThread(){}

       public MyThread( MyRunnable mr )

       {

              this.mr=mr;

       }

       public void run()

       {

              mr.run();

       }

      

       public void start()

       {

              this.run();

       }

      

}

 

/*

//通过继承的方法实现多线程

class Test extends MyThread

{

       public void run()

       {

              System.out.println( " entends run " );

       }

}

*/

 

//通过实现接口的方法实现多线程

class Test implements MyRunnable

{

       public void run()

       {

              System.out.println( " interface run " );

       }

}

 

class Demo

{

       public static void main( String args[])

       {

              //通过继承的方法实现多线程

       /*    Test t=new Test();

              t.start();

       */          

              //通过实现接口的方法实现多线程

              Test t=new Test();

              MyThread mt=new MyThread( t );

              mt.start();

       }

}

 

二.        线程安全问题

 

1.       线程的最大特点:随机性

2.       使用同步可解决以上的问题:

a,  原理:把代码封装并加锁

b,  注意两点:

1.       两个或两个以上的线程使用同一资源

2.       使用同一把锁

c,  两种方法:

1.  使用同步代码块(Synchronized

2.  使用同步函数(Synchronized

 

3.要注意由于线程嵌套而出现死锁的情况。

 

三.线程间的通信

 

1.       常用的函数

sleep(),wait(),notify(),notifyAll(),toString()setPriority()

 

其中wait(),notify(),notifyAll()都是在Object类中,因为可以被任意对象所调用的方法。一定定义在Object类中。

 

sleep()和wait()的区别

sleep():释放资源,不释放锁

wait():、释放资源,释放锁

 

下面是一个线程通信的例子

/*

线程的通信问题, 一个输出必须在一个输入完成后才可以进行,用到了线程间通信的知识

*/

 

class Res

{

       String name;

       String sex;

       boolean b=true;

       public synchronized void set( String name, String sex )

       {

              if( b)

                     try{ this.wait();}catch( Exception e ){}

              this.name=name;

              this.sex=sex;

              b=true;

              notify();

       }

      

       public synchronized  void out()

       {

              if( !b)

                     try{ this.wait();}catch( Exception e ){}

              b=false;

              notify();

              System.out.println( Thread.currentThread().getName()

                            +"---"+name+" "+sex  );

       }

}

 

class Input implements Runnable

{

       Res r;

       int i=0;

       Input( Res r)

       {

              this.r=r;

       }

       public void run()

       {

              while( true )

              {

                    

                    

                     if( i==0)

                     {

                            r.set( " dsdf","nan");

                     }

                     else

                     {

                            r.set( " 丽丽","");

                           

                     }

                    

                     i=(i+1)%2;

                    

                    

              }

       }

      

}

 

class Output implements Runnable

{

       Res r;

       Output( Res r )

       {

              this.r=r;

       }

       public void run()

       {

              while( true )

              {

                     r.out();

                    

              }

       }

}

 

class Demo1

{

       public static void main( String aers[])

       {

              Res r=new Res();

              new Thread( new Input(r)).start();

              new Thread( new Output(r)).start();

       }

}

 

2.如何结束运行的线程

 

 以前通过stop()方法。但该方法已过时。现在可以通过定义标记的形式来控制循环。因为线程一般都是循环做某些事情,所以可通过结束标志的方法结束线程。

 

 

最后附上一幅这篇学习笔记的思维导图:



 

  • 大小: 145.6 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics