多线程的学习笔记

原创 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进行控制,是不是会浪费很多资源

 

 

java多线程学习笔记(一)!更好的理解多线程

1.线程的创建 之前知道java中一个多线程的创建方法是继承Thread类或者实现Runable接口,但是看不懂下面这种创建线程的方法 第一种 new Thread(new Runnable()...
  • a347911
  • a347911
  • 2016年11月15日 09:56
  • 450

[读书笔记]多线程学习笔记

几乎所有的操作系统都支持同时运行多个任务,一个任务通常就是一个程序,每个运行的程序就是一个进程。当一个程序运行时,内部可能包含了多个顺序执行流,每个执行流就是一个线程。线程和进程所有运行中的任务通常对...
  • CodeEmperor
  • CodeEmperor
  • 2016年02月07日 12:12
  • 934

c++ 多线程学习笔记(一)

Handle CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, //线程内核对象的安全属性,一般传入NULL表示使用默认设置 SIZE_T...
  • cwbguaijie
  • cwbguaijie
  • 2017年11月10日 15:32
  • 33

java学习笔记(九)----多线程

class ThreadDemo1{ public static void main(String[] args)  { new TestThread().start(); //用start()默认去...
  • fhx007
  • fhx007
  • 2006年05月31日 13:00
  • 1485

C#学习笔记 线程同步

多个线程同时操作一个数据的话,可能会发生数据的错误。这个时候就需要进行线程同步了。用户模式同步构造易变构造CLR保证4字节以下的基本类型的读写是原子性的,也就是说这些变量的值都会一次性被读取或者写入。...
  • u011054333
  • u011054333
  • 2016年01月10日 23:31
  • 416

Java多线程(全)学习笔记(上)

资源下载地址:http://download.csdn.net/detail/cloudyxuq/3763101 一.线程的创建和启动 java使用Thread类代表线程,所有的线程对象都必须是T...
  • Cloudyxuq
  • Cloudyxuq
  • 2011年11月06日 21:07
  • 8192

windows程序设计学习笔记--多任务和多线程

windows中的数据传输:剪切板,动态数据交换,对象链接和嵌入。非抢占式多任务,指 处理完一个消息才处理下一个消息。 帮助解决非抢占式多任务局限方式: 1.设置鼠标图标状态。 2.Win...
  • x13262608581
  • x13262608581
  • 2016年07月23日 11:03
  • 565

C++学习笔记--多线程

优缺点对比: 多线程开销小,但难于管理,且不能用于分布式系统; 多进程开销大,操作系统会进行一部分管理,因此用户管理就比较简单,可用于分布式; 通常多线程和多进程结合使用。 参考资料:http...
  • du_qi
  • du_qi
  • 2016年08月26日 22:35
  • 1243

《java多线程编程核心技术》读书笔记1

第一章:java多线程技能 在学习线程之前我们首先要清楚一下进程的概念:            进程是操作系统结构的基础,是系统进行资源分配的和调度的独立单位。window...
  • GODBAR
  • GODBAR
  • 2016年09月03日 08:15
  • 760

操作系统学习笔记(三)

关于进程同步的经典问题
  • qq_24282081
  • qq_24282081
  • 2017年04月17日 20:33
  • 430
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多线程的学习笔记
举报原因:
原因补充:

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