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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

一、线程的创建:
1.继承Thread类,复写run()方法。
class Thread1 extends Thread
{
public void run()
{
  for(int x=0; x<20; x++)
   System.out.println("Thread1 run--"+x);
}
}
class Test
{
  public static void main(String[] args)
  {
    Thread1 a = new Thread1();
     a.start();
     for(int x=0; x<20; x++)
     System.out.println("Main run--"+x);
  }
}
2.实现Runnable接口,覆盖run()方法。好处:避免了单继承的局限性。
class Thread1 implements Runnable
{
public void run()
{
  for(int x=0; x<20; x++)
   System.out.println("Thread1 run--"+x);
}
}
class Test
{
  public static void main(String[] args)
  {
    Thread1 b = new Thread1();
    Thread a = new Thread(b);
     a.start();
     for(int x=0; x<20; x++)
     System.out.println("Main run--"+x);
  }
}
二、线程的五种状态:
1.被创建,通过 new Thread()来创建线程。
2.运行状态,通过线程的start()方法运行线程。
3.冻结状态,通过sleep()、wait(),方法让线程冻结。
4.阻塞状态,线程从冻结状态激活,具备了运行资格,但未获取到执行权
5.消亡,线程的run()方法的结束,或者通过stop()方法 使线程终结。
三、线程的同步,由于多线程运行时,各线程会存在CPU的执行权互相争抢,导致共享的数据错误,所以使用同步加锁来保证多线程的安全性。但是同步同时也比较消耗资源。
1.同步代码块
synchronized(对象)
{
   需要同步的代码
}
2.同步函数
public synchronized void show(){}
注意:非静态同步函数使用的锁的对象为this,也就是本类对象。静态同步函数所使用的锁为 类名.class 为本类对象的字节码文件对象。
三、死锁
同步中嵌套同步,但是他们各自使用的锁却不为同一对象。如下:俩个线程同时运行里面的if else的俩段代码。
if(ture){
public synchronized void show()
{
    synchronized(Object)
    {
      需要同步的代码;
    }
}
}
else{
synchronized(Object)
{
   public synchronized void show()
   {
     需要同步的代码
   }
}
}

5 个回复

倒序浏览
本帖最后由 李乾 于 2014-1-22 22:22 编辑

多线程安全问题的原因:
一个线程在执行多条语句时,并运算同一个数据时,在执行过程中,其他线程参与进来,并操作了这个数据。导致到了错误数据的产生。
涉及到两个因素:
1,多个线程在操作共享数据。
2,有多条语句对共享数据进行运算。
原因:这多条语句,在某一个时刻被一个线程执行时,还没有执行完,就被其他线程执行了。
解决安全问题的原理:
只要将操作共享数据的语句在某一时段让一个线程执行完,在执行过程中,其他线程不能进来执行就可以解决这个问题。

回复 使用道具 举报
李乾 发表于 2014-1-22 22:19
多线程安全问题的原因:一个线程在执行多条语句时,并运算同一个数据时,在执行过程中,其他线程参与进来, ...

由于多线程运行时,各线程会存在CPU的执行权互相争抢,导致共享的数据错误,所以使用同步加锁来保证多线程的安全性。但是同步同时也比较消耗资源。
回复 使用道具 举报
李乾 发表于 2014-1-22 22:19
多线程安全问题的原因:一个线程在执行多条语句时,并运算同一个数据时,在执行过程中,其他线程参与进来, ...

谢谢补充~~~
回复 使用道具 举报

共同学习,共同进步。:)
回复 使用道具 举报
顶一个,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马