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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yuchun 中级黑马   /  2015-7-29 14:51  /  124 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

多线程
进程:是一个正在执行中的程序。每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元。

线程:就是进程中的一个独立的控制单元。线程在控制着进程的执行。一个进程中至少有一个线程。

Java的JVM启动的时候会有一个进程java.exe。该进程中至少一个线程负责Java程序的执行,而且这个线程运行的代码存在于main方法中,该线程称之为主线程。


创建线程方式一(继承方式)
步骤:1、定义类继承Tread。
      2、复写Tread类中的run方法。目的:将自定义的代码存储在run方法,让线程运行。
      3、建立子类对象(对象的同时线程也被创建),通过调用start方法开启线程。(线程的start方法能启动线程,调用run方法。Thread类中的run方法,用于存储线程要运行的代码。)

class Demo extends Thread
{
        public void run()
        {
                for(int x=0; x<60; x++)
                        System.out.println("demo run----"+x);
        }
}

class ThreadDemo
{
        public static void main(String[] args)
        {
                Demo d = new Demo();//创建好一个线程。
                d.start();//开启线程并执行该线程的run方法。
                //d.run();//仅仅是对象调用方法。而线程创建了,并没有运行。
        }
}


创建线程方式二(实现Runnable接口)
步骤:1、定义类实现Runnable接口;
      2、覆盖Runnable接口中的run方法;将线程要运行的代码存放在该运行run方法中。
      3、通过Thread类建立线程对象;
      4、将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。
      5、调用Thread类的start方法开启线程并调用Runnable接口子类的Run方法。
class Ticket implements Runnable//extends Thread
{
        private  int tick = 100;
        public void run()
        {
                while(true)
                {
                        if(tick>0)
                        {
                                System.out.println(Thread.currentThread().getName()+"....sale : "+ tick--);
                        }
                }
        }
}

class  TicketDemo
{
        public static void main(String[] args)
        {

                Ticket t = new Ticket();
                Thread t1 = new Thread(t);//创建了一个线程;
                Thread t2 = new Thread(t);//创建了一个线程;
                Thread t3 = new Thread(t);//创建了一个线程;
                Thread t4 = new Thread(t);//创建了一个线程;
                t1.start();
                t2.start();
                t3.start();
                t4.start();
        }
}

实现方式和继承方式有什么区别?
继承Thread:线程代码存放在Thread子类run方法中;
实现Runnable:线程代码存放在接口的子类的run方法中。避免了单继承的局限性。

同步代码块
synchronized(对象)
{
    需要被同步的代码;
}
同步的前提:
1、必须要有两个或者两个以上的线程。
2、必须是多个线程使用同一个锁。
class Ticket implements Runnable //extends Thread
{
        private static int tick =100;
        Object obj=new Object();
        public void run()
        {
                while(true)
                {
                        synchronized(obj)
                        {
                                if(tick>0)
                                {
                                        try{Thread.sleep(10);}
                                        catch(Exception e){}
                                        System.out.println(Thread.currentThread().getName()+"sale:"+tick--);
                                }
                        }
                }
        }
}

class  TicketDemo2
{
        public static void main(String[] args)
        {
                Ticket t = new Ticket();

                Thread t1=new Thread(t);
                Thread t2=new Thread(t);
                Thread t3=new Thread(t);
                Thread t4=new Thread(t);

                t1.start();
                t2.start();
                t3.start();
                t4.start();
        }
}








同步函数使用的锁是this
静态的同步方法,使用的锁是该方法所在类的字节码文件对象:   类名.class

class Ticket implements Runnable
{
        private static int tick=100;
        //Object obj=new Object();
        boolean flag=true;
        public void run()
        {
                   if(flag)
                   {
                       while(true)
                           {
                                   //synchronized(obj)
                                   //synchronized(this)
                                    synchronized(Ticket.class)
                                   {
                                           if(tick>0)
                                           {
                                                   try{Thread.sleep(10);}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"...sale:"+tick--);
                                        }
                                }
                        }
                }
                else
                        while(true)
                        show();
        }
        public static synchronized void show()
        {
                  if(tick>0)
                    {
                            try{Thread.sleep(10);}catch(Exception e){}
                            System.out.println(Thread.currentThread().getName()+"...code...:"+tick--);
                    }
        }
}
class StaticMethodDemo
{
        public static void main(String[] args)
        {
                Ticket t=new Ticket();
        Thread t1=new Thread(t);
                Thread t2=new Thread(t);
       
                t1.start();
                try{Thread.sleep(10);}catch(Exception e){}
                t.flag=false;
                t2.start();
        }
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马