A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 韦振华 中级黑马   /  2013-3-27 13:48  /  2159 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

多线程的定义一种有几种方法,每种方法都是怎么实现的?还有就是线程的安全问题,怎么正确使用Synchronized来解决线程的安全问题

点评

如果问题未解决,请继续追问回复者,如果问题已经解决,请将分类改为“已解决”,谢谢  发表于 2013-3-27 19:50

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

7 个回复

倒序浏览
JDK 提供两种  
一种是实现接口Runnable 实现里面的run方法 void run()  使用实现接口 Runnable 的对象创建一个线程时,启动该线程将导致在独立执行的线程中调用对象的 run 方法。
另一种是继承 Thread类重写方法run()

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
定义线程有两种方式:
  1。new 一个Thread 的子类,在子类中重写run()方法。
  2.  创建一个实现Runable 接口的实例。传递给neThread的构造方法。

怎么正确使用Synchronized来解决线程的安全问题?
  
  这个你就要看你的哪些代码是多个线程共享的。都操作了共享数据。
我把操作共享数据的代码同步了,就安全了。
回复 使用道具 举报
多线程的定义 :
  
第一: 继承Thread类
第二种: 实现Runnable接口

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

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

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

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
定义线程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修饰就行了.

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
创建线程可以使用继承thread类和实现Runnable接口。

实现接口Runnable的对象要实现run()方法来创建一个线程。
而继承thread的类要方法重载run()方法来创建线程。
回复 使用道具 举报
基本都用实现接口的方式来写多线程方法,要启动多线程的话,只需要获得线程的实例,然后用start方法,让线程处于准备状态,等待jvm给线程分配内存和处理器资源执行。
回复 使用道具 举报
楼主:
首先,线程有两种方式实现,
一个是继承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();
                       
                       
                }

        }

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马