多线程的学习笔记

原创 2011年01月22日 19:33:00

           对于单cpu电脑,它会时分复用的执行系统中的多个进程,而每个进程中也会有多个线程。

 

练习1:程序在没有采取多线程技术时,默认单线程执行

 

练习2:程序添加多线程技术以后,类ThreadDemo继承多线程类Thread,实现其run方法。

class ThreadDemol

{

       public static void main(String [] args)

       {

              new ThreadDemo().start();//run();

              while(true)

              {

                            System.out.println("main()"+Thread.currentThread().getName());

              }

       }

}

class ThreadDemo extends Thread

{

       public void run()

       {

              while(true)

              {

                            System.out.println("run()"+Thread.currentThread().getName());

              }

       }

}

 

练习3:后台线程与联合线程

1)  只要还有一个前台线程运行,进程就不会结束。

2)  加入后台线程,进程会很快结束

3)  Thread tt=new ThreadDemo();

              tt.setDaemon(true);

              tt.start();

4)  join()进行线程联合

Thread tt=new ThreadDemo();

              tt.start();

              int index=0;

              while(true)

              {

                            if(index++==100)

                                   try{tt.join();}catch(Exception e){}

                            System.out.println("main()"+Thread.currentThread().getName());

              }

总结:刚开始两个线程交替执行,在主线程执行100次之后,调用tt线程的join方法,只执行tt线程

try{tt.join(5000);}catch(Exception e){}

总结:在join中添加时间,在tt线程执行5秒之后,又开始两个线程交替运行。

 

练习4Thread类的构造方法,用Runnable接口实现多线程

1)  通过继承的方法实现多线程卖票

new ThreadDemo().start();

            new ThreadDemo().start();

            new ThreadDemo().start();

            new ThreadDemo().start();

总结:构建了4个卖票的对象线程,分别卖100张票

2)  通过接口的方法实现多线程卖票

     ThreadDemo tt=new ThreadDemo();

              new Thread(tt).start();

               new Thread(tt).start();

                new Thread(tt).start();

                    new Thread(tt).start();

 

总结:一般多线程都有接口实现,用起来较灵活,一个类可以有多个接口。

 

练习5:多线程的应用

1)  聊天时可以同时执行收发数据的程序

2)  一个循环执行的程序,可以用多线程控制

 

练习6:多线程的同步多线程的控制

1)  synchronized(str)监视器

在需要线程保护的代码块加入synchronized,将str设置为全局变量,当某一线程开始执行时,str的标志位从1变为0,执行结束时str’标志从0变为1当其他的线程想加入时会判断str的状态,如果str0则不能加入,这达到了对某个程序块完整执行的保护。

2)  代码块和函数同步

在代码块上加入this对象,使代码块和函数公用一个对象进行监视。

3)  死锁

当两个呈现原子性的代码块并行运行时,一个代码块在运行时调用另外一个代码块的锁的状态,该代码块将被锁住

1.34分)

练习7:使用多线程进行通信

原始代码:

  class Producer implements Runnable

{

       Q q;

       public Producer(Q q)

       {

              this.q=q;

       }

       public void run()

       {

              int i=0;

              while(true)

              {

                     synchronized(q)

                     {

                            if(q.bFull)

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

                            if(i==0)

                            {

                                   q.name="zhangsan";

                                   try{Thread.sleep(1);}catch(Exception e){}

                                   q.sex="male";

                            }else

                            {

                                   q.name="lisi";

                                   q.sex="female";

                            }

                            q.bFull=true;

                            q.notify();

                     }

                     i=(i+1)%2;

                    

              }

 

       }

}

class Consumer implements Runnable

{

       Q q;

       public Consumer(Q q)

       {

              this.q=q;

       }

       public void run()

       {

              while(true)

              {

                     synchronized(q)

                     {

                            if(!q.bFull)

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

                     System.out.print(q.name);

                     System.out.println(":"+q.sex);

                     q.bFull=false;

                     q.notify();

                     }

              }

       }

 

             

}

class Q

{

       String name="unknow";

       String sex="unknow";

       boolean bFull=false;

      

}

class ThreadCommunation

{

       public static void main(String args[])

       {

              Q q=new Q();

              new Thread(new Producer(q)).start();

              new Thread(new Consumer(q)).start();

 

       }

}

代码精简后:

class Producer implements Runnable

{

       Q q;

       public Producer(Q q)

       {

              this.q=q;

       }

       public void run()

       {

              int i=0;

              while(true)

              {

                            if(i==0)

                            {

                                   q.set("zhangsan","male");

                            }else

                            {

                                   q.set("lisi","female");

                            }

                            i=(i+1)%2;

              }

 

       }

}

class Consumer implements Runnable

{

       Q q;

       public Consumer(Q q)

       {

              this.q=q;

       }

       public void run()

       {

              while(true)

              {

                     q.get();

              }

       }

}

class Q

{

       String name="unknow";

       String sex="unknow";

       boolean bFull=false;

       public synchronized void set(String name,String sex)

       {

              if(bFull)

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

              this.name=name;

              try{Thread.sleep(1);}catch(Exception e){}

              this.sex=sex;

              bFull=true;

              notify();

       }

       public synchronized void get()

       {

              if(!bFull)

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

              System.out.print(name);

              System.out.println(":"+sex);

              bFull=false;

              notify();

       }

}

class ThreadCommunation

{

       public static void main(String args[])

       {

              Q q=new Q();

              new Thread(new Producer(q)).start();

              new Thread(new Consumer(q)).start();

 

       }

}

 

总结:使在缓存中填入数据和在缓存中读取数据具有原子性,这样就不会在读取姓名zhangsan时,又被中断而读取性别是female,而实现同步。使用waitnotify进行流程控制,使数据放入之后再取,数据取出时再放,使通信更加有效。

练习8:线程控制

源代码:

class ThreadCommunation

{

       public static void main(String args[])

       {

              ThreadTest t=new ThreadTest();

              Thread tt=new Thread(t);

              tt.start();

              for(int i=0;i<100;i++)

              {

                     if(i==50)

                            t.stopMe();

                     System.out.println("main() is running");

              }

 

       }

}

 

class ThreadTest implements Runnable

{

       private boolean bStop=false;

              public void stopMe()

              {

                     bStop=true;

              }

        public void run()

       {

               while(!bStop)

              {

                     System.out.println(Thread.currentThread().getName()+"is runnting");

               }

        }

}

总结:在某个线程上的程序运行结束时,线程自动释放,通过编写代码可以控制线程的生命周期。

 

问题1:既然是后台线程,为什么能看到开始的执行?而不是一开始就什么都看不到

问题2:在通信时用synchrorized和用waitnotify进行控制,是不是会浪费很多资源

 

 

相关文章推荐

UNIX多线程学习笔记

  • 2011年08月15日 13:46
  • 80KB
  • 下载

java学习笔记2(多线程)

  • 2011年08月30日 19:02
  • 210KB
  • 下载

java学习笔记之多线程的锁接口Lock

众所周知,多线程的弊端是会使代码受到并发访问的干扰,解决的办法就是同步机制。同步的两种常见形式分别是同步代码块和同步函数,两种形式的锁都是隐式锁,前者持有的锁可以是任意对象,后者持有的锁是默认的thi...

多线程学习笔记与学习

  • 2011年07月04日 08:28
  • 85KB
  • 下载

Java多线程内存可见性实现 synchronized (java 学习笔记)

Java多线程内存可见性实现 synchronized &volatile(java 学习笔记) 这只是一个师范学院的计算机非师范大一生自学JAVA的小小笔记。学习于网上资源(百度,csdn,慕课网...
  • lymmm2
  • lymmm2
  • 2015年06月24日 21:15
  • 297

多线程--毕向东java基础教程视频学习笔记

目录 1.多线程运行的安全问题 2.多线程同步代码块 3.同步方法的锁是this 4.静态同步方法的锁是Class对象 5.单例设计模式(面试中的考点) 6.死锁(一个发生死锁的例子) ...

[Java] 学习笔记一(String,for循环,多线程,正则表达式,map用法)

StringString.equals (String) 判断两个字符串对象的内容是否相同。 值得注意的是,String.equals与’==’操作不同。前者比较的是两者的内容是否相同,而后者比较...

java多线程学习笔记——yield()、wait()、sleep()等方法

1、sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据。注意该...

黑马程序员---Java基础学习笔记(多线程-后篇)

------------Android培训、Java培训、期待与您交流---------- 1.wait()、sleep()、notify()、notifyAll()方法     wait(...

Python中的多线程threading和线程间消息队列queue学习笔记

python中实现多线程可以通过threading类。线程间同步则可以用queue类。至于python的进程间通信,暂时没有发现有类似linux ipc的模块可供使用,但是可以通过unix域套接字实现...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多线程的学习笔记
举报原因:
原因补充:

(最多只允许输入30个字)