黑马程序员技术交流社区

标题: 怎么定义一个多线程 [打印本页]

作者: 韦振华    时间: 2013-3-27 13:48
标题: 怎么定义一个多线程
多线程的定义一种有几种方法,每种方法都是怎么实现的?还有就是线程的安全问题,怎么正确使用Synchronized来解决线程的安全问题
作者: 王浩威    时间: 2013-3-27 13:59
JDK 提供两种  
一种是实现接口Runnable 实现里面的run方法 void run()  使用实现接口 Runnable 的对象创建一个线程时,启动该线程将导致在独立执行的线程中调用对象的 run 方法。
另一种是继承 Thread类重写方法run()
作者: itserious    时间: 2013-3-27 14:06
定义线程有两种方式:
  1。new 一个Thread 的子类,在子类中重写run()方法。
  2.  创建一个实现Runable 接口的实例。传递给neThread的构造方法。

怎么正确使用Synchronized来解决线程的安全问题?
  
  这个你就要看你的哪些代码是多个线程共享的。都操作了共享数据。
我把操作共享数据的代码同步了,就安全了。

作者: 罗胜华    时间: 2013-3-27 14:12
多线程的定义 :
  
第一: 继承Thread类
第二种: 实现Runnable接口

三.关于线程安全的问题: 其实就是防止线程并发  并发的意思就是:同时操作

所以你就要用同步代码快把你认为 有可能发生线程并发的语句括起来 再加把锁

Synchronized(this){
  同步代码块
}
一般锁可以用字符串 或者是this关键字。

作者: 程宁宁    时间: 2013-3-27 14:13
定义线程2种方法:

1.继承Thread类
     如:class B extends Thread{
        public void run() {
                //....你要实现的方法
        }
     }
   
new B().start();//运行
2.实现Runnable接口
如:class A implements Runnable{
        public void run() {
                //....你要实现的方法
        }
     }

  new Thread(new A()).start();//运行

再有同步的问题,在需要同步的方法上用Synchronized修饰就行了.
作者: 黄杨    时间: 2013-3-27 14:36
创建线程可以使用继承thread类和实现Runnable接口。

实现接口Runnable的对象要实现run()方法来创建一个线程。
而继承thread的类要方法重载run()方法来创建线程。
作者: VOIDMAIN    时间: 2013-3-29 22:56
基本都用实现接口的方式来写多线程方法,要启动多线程的话,只需要获得线程的实例,然后用start方法,让线程处于准备状态,等待jvm给线程分配内存和处理器资源执行。
作者: 王_强    时间: 2013-3-30 17:29
楼主:
首先,线程有两种方式实现,
一个是继承Thread类,再去重写run()方法,
第二个是实现Runnable接口,实现Run()方法,
这里我补充一点的是:我们一般都是用第二种,因为要是第二组的话,能实现资源共享,第一种,就是多个线程拥有独立的资源,这一点非常重要,也是为什么现在推广使用第二种的原因!

第一种:
class Demo extends Thread{
        public void run(){
                for(int i=0;i<60;i++)
                System.out.println("demo run");
        }
}

public class ThreadTest1 {

  
        public static void main(String[] args) {
               
        //创建好一个线程,就多了一个执行路径
                Demo d=new Demo();
                d.run();
                for(int i=0;i<100;i++)
                        System.out.println("hello word");

        }

}

第二种:

class Ticket implements Runnable{
       
           private  static int tick=1000;
           Object obj=new Object();
           boolean flag=true;
          
                public void run(){
                        if(flag){
                            while(true){
                             synchronized (obj) {
                                        if(tick>0){
                                                System.out.println(Thread.currentThread().getName()+":"+tick--);
                                        }
                                }
                        }
                        }else
                                while(true)
                                        show();
         }
               
                public  synchronized  void show(){
                        if(tick>0)
                                System.out.println(Thread.currentThread().getName()+":"+tick--);
                }
               
        }

        public class TicketTest {

                /**
                 * 简单的卖票程序
                 * 多线程卖票
                 */
                public static void main(String[] args) {
                        //每创建一个线程,都会创建一个线程独立空间
                        //我现在只建立一个对象,
                        Ticket t=new Ticket();
             
                        Thread t1=new Thread(t,"0");//创建一个线程
                        Thread t2=new Thread(t,"1");//创建一个线程
                        //怎么让这个对象和线程有关联呢?
                        t1.start();
                        try{
                        Thread.sleep(10);
                        }catch(Exception e){}
                        t2.start();
                       
                       
                }

        }




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