黑马程序员技术交流社区

标题: 如何开启多线程 [打印本页]

作者: ozt6719393    时间: 2013-5-22 17:27
标题: 如何开启多线程
如何开启多线程
作者: 金辉    时间: 2013-5-22 17:45
这是基础视屏上讲的很清楚的吧
作者: youngster    时间: 2013-5-22 17:57
开始线程时获得线程对象后进行start()方法开始线程的,在基础视频中都有详细讲解哦,楼主要认真看视频中讲解的内容啊。
作者: Super_Class    时间: 2013-5-22 18:14
|---自定义线程
                                        class MyThread extends Thread       
                                        class MyThread implements Runnable
                                |---开启线程的方法(对应上边的两个自定义线程)       
                                        new MyThread().start();
                                        new Thread(new MyThread()).start();//这里只能这样开启,不能像Thread的子类那样

作者: 王靖远    时间: 2013-5-22 19:24
线程对象.strat()。开启
作者: 高波    时间: 2013-5-22 19:57
创建线程对象;
调用线程的start()方法。
  1. package thread;

  2. /*
  3. * 通过分析,发现,打印出0,-1,-2等错票。
  4. * 多线程的运行出现了安全问题。
  5. * 问题的原因:
  6. *                 当多条语句在操作同一个线程共享数据(tick)时,一个线程对多条语句只执行了一部分,还没有执行完。
  7. *                 另一个线程参与进来执行。导致共享数据的错误。
  8. *
  9. * 解决方法:
  10. *                 对多条错做共享数据的语句,只能让一个线程都执行完。在执行过程中其他线程不可以参与执行。
  11. *
  12. * java对于多线程的安全问题提供了专业的解决方式。
  13. * 就是同步代码块:
  14. * synchronized(对象)
  15. * {
  16. *                 需要被同步的代码
  17. * }
  18. *
  19. * 对象如同锁,持有锁的线程可以在同步中执行。
  20. * 没有持有锁的线程即使获取CPU的执行权,也进不去,因为没有获取锁。
  21. * 例子: 火车上的厕所————经典
  22. *
  23. * 同步的前提:
  24. * 1,必须要有两个或者两个以上的线程。
  25. * 2,必须是多个线程使用同一个锁。
  26. * 必须保证同步中只能有一个线程在运行。
  27. *
  28. * 好处:解决多线程的安全问题。
  29. * 弊端:多个线程都要判断锁,比较消耗资源。
  30. */
  31. class Tickets implements Runnable {
  32.         private int tick = 100;
  33.         Object obj = new Object();

  34.         public void run() {

  35.                 while (true) {
  36.                         synchronized (obj) {
  37.                                 if (tick > 0) {
  38.                                         try {
  39.                                                 Thread.sleep(10);
  40.                                         } catch (InterruptedException e) {
  41.                                                 e.printStackTrace();
  42.                                         }
  43.                                         System.out.println(Thread.currentThread().getName()
  44.                                                         + "Sale...:" + tick--);
  45.                                 }
  46.                         }
  47.                 }
  48.         }
  49. }

  50. public class SynchronizedDemo {

  51.         public static void main(String[] args) {
  52.                 Tickets t = new Tickets();
  53.                 Thread t1 = new Thread(t);// 创建一个线程
  54.                 Thread t2 = new Thread(t);
  55.                 Thread t3 = new Thread(t);
  56.                 Thread t4 = new Thread(t);
  57.                 t1.start();
  58.                 t2.start();
  59.                 t3.start();
  60.                 t4.start();
  61.         }
  62. }
复制代码
上面是毕老师讲锁的时候的一部分代码,主方法内的t1,t2,t3,t4就是4个线程对象,分别调用start()方法,启动线程
作者: Sofoul    时间: 2013-5-22 22:27
写一个子类继承Thread类,重写run方法,创建n个子类对象,调用start()方法就开启多线程了。
package thread;

public class ThreadDemo3 extends Thread{
        public ThreadDemo3(){}
        public ThreadDemo3(String name){
                super(name);
               
        }
        public void run(){
                for(int x=0;x<1000;x++){
                System.out.println(getName()+"--"+x);
                }
        }
       
}


public class ThreadDemoTest3 {

        /**
         * @param args
         */
        public static void main(String[] args) {
                ThreadDemo3 t=new ThreadDemo3("张飞");
                ThreadDemo3 t1=new ThreadDemo3("光宇");
                ThreadDemo3 t2=new ThreadDemo3("曹操");
                t.start();
                t1.start();
                t2.start();
        }       

}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2