黑马程序员_多线程

----------------------android培训java培训、期待与您交流! ----------------------

        线程和进程:

       当一个程序进入内存运行,即变成一个进程。进程是处于运行过程中的程序,并且具有一定独立功能,进程是系统进行资源分配和调度的一个独立单位。一般而言,进程包含独立性,动态性和并发性。并行性是指同一时刻,有多条指令在多个处理器上同时执行;并发性是指同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果。线程也被称作轻量级进程,线程是进程的执行单元。线程是进程的组成部分,一个进程可以拥有多个线程,一个线程必须有一个父进程。线程是共享父进程中的共享变量及部分环境,相互之间协同来完成进程所要完成的任务。

       线程的创建和启动:

       java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。每条线程的作用是完成一定的任务,实际上是执行一段顺序执行代码,java使用run方法来封装一段顺序执行代码。创建线程的方法有两种:一种是继承Thread类创建线程类;另一种是实现Runnable接口创建线程类。

         通过继承Thread类来创建并启动多线程的步骤:1.定义Thread类的子类,并重写该类的run方法,该run方法的方法体就是代表了线程需要完成的任务,因此,我们经常把run方法称为线程执行体。2.创建Thread子类的实例,及创建了线程对象。3.用线程对象的start方法来启动线程。

    实现Runnable接口来创建并启动多线程的步骤:1.定义Runnable接口的实现类,并重写该接口的run方法,该run方法的方法体同样是该线程的线程执行体。2.创建Runnable实现类的实例,并以此实例作为Thread的参数来创建Thread对象,该Thread对象才是真正的线程对象。启动线程使用start方法,而不是run方法。调用start方法来启动线程,系统会把该run方法当成线程执行体来处理,调用run方法则run方法会立即被执行,就是只是把run方法当成一个普通的方法执行。

    线程的运行和阻塞状态

       控制线程:

           join线程:java 提供了让线程等待另一个线程完成的方法join()方法。当某个程序执行流中调用其他线程的join方法时,调用线程将被阻塞,直到join方法加入的join线程完成为止。

       后台线程:有一种线程,它是在后台运行的,它的任务就是为其他线程提供服务,这种线程称为后台线程,又称为守护线程。后台线程有一个特征就是如果所有的前台线程都死亡,后台线程会自动死亡。调用Thread对象的setDaemon(ture)方法可以将指定线程设置成后台线程。

      线程睡眠:sleep;线程让步:yield;改变优先级

      如果我们需要让当前正在执行的线程暂停一段时间,并进入阻塞状态,则可以通过调用Thread类的静态方法sleep方法。yield()方法是一个和sleep方法有着相似的方法,它也可以让当前正在执行的线程暂停,但它不会阻塞该线程,它只是将线程转入就绪状态。每个程序执行都具有一定的优先级,Thread提供了setPriority(int newPriority)和getPriority()方法来设置和返回指定线程的优先级。

     线程的同步及线程安

    当多个线程共享同一个数据时容易产生安全问题,比如银行取钱的问题,账户上面有1000元,两个线程去取,各取800,最后结果账户成了-600,这不是银行希望的结果。解决线程安全问题可以使用同步代码块,同步函数,或Lock锁。

    同步代码块:synchronized(obj){ .....//此处的代码就是同步代码块  }   该语法格式中的synchronized后括号里的obj就是同步监视器,该代码的含义是:线程开始执行同步代码块之前,必须先获得对同步监视器的锁定。任何时刻只能有一条线程可以获得对同步监视器的锁定,当同步代码块执行结束之后,该线程自动释放了对该同步监视器的锁定。同步函数与同步代码块是对应的,同步方法就是使用synchronized关键字来修饰某个方法,则该方法称为同步方法。对于同步方法无需指定同步监视器,同步方法的同步监视器就是this,也就是该对象本身。当线程的同步方法执行完就会释放同步监视器,在方法中遇到break,return终止代码,出现未处理的Error,Exception,执行了监视器对象的wait()方法则会释放同步监视器。

    同步锁Lock,这是从java 1.5之后提供的另一种线程同步机制:它通过显式定义同步锁对象来实现同步,在这种机制下,同步锁应该使用Lock对象充当。通常认为:Lock提供了比synchronized方法和代码块更广泛的锁定操作,Lock实现允许更灵活的结构,可以具有差别很大的属性,并且可以支持多个相关的Condition对象。Lock代码格式:

class X
{
    //定义锁对象
    private final Lock lock = new Lock();
   //定义需要保证线程安全的代码
    public void m()
    {
          lock.lock();   //加锁
          try {..... //需保证线程安全的代码}
         //使用finally块来释放锁
        finally{  lock.unlock();  }
     }
}

     死锁

        当两个线程相互等待对方释放同步监视器时就会发生死锁,java虚拟机没有监测,也没有采用措施来处理死锁情况,所以多线程编程时应该采取措施避免死锁的出现。一旦出现死锁,整个程序既不会发生任何异常,也不会给出任何提示,只是所有线程处于阻塞状态,无法继续。写出一个死锁程序:

class Test implements Runnable
{
	private boolean flag; // 定义标记
	Test(boolean flag)
	{
		this.flag = flag;
	}

	public void run()
	{
		if(flag)
		{
			while(true)
			{
				synchronized(MyLock.locka)
				{
					System.out.println(Thread.currentThread().getName()+"...if locka ");
					synchronized(MyLock.lockb)   //在locka中需要lockb锁
					{
						System.out.println(Thread.currentThread().getName()+"..if lockb");					
					}
				}
			}
		}
		else
		{
			while(true)
			{
				synchronized(MyLock.lockb)
				{
					System.out.println(Thread.currentThread().getName()+"..else lockb");
					synchronized(MyLock.locka)  在lockb中需要locka锁
					{
						System.out.println(Thread.currentThread().getName()+".....else locka");
					}
				}
			}
		}
	}
}


class MyLock
{
	static Object locka = new Object();
	static Object lockb = new Object();
}

class  DeadLockTest
{
	public static void main(String[] args) 
	{
		Thread t1 = new Thread(new Test(true));
		Thread t2 = new Thread(new Test(false));
		t1.start();
		t2.start();
	}
}


 

---------------------- android培训java培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net/heima

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值