当前位置:首页 > 开发 > 编程语言 > 多线程 > 正文

线程同步和异步

发表于: 2014-07-16   作者:百合不是茶   来源:转载   浏览:
摘要: 多线程和同步 : 如进程、线程同步,可理解为进程或线程A和B一块配合,A执行到一定程度时要依靠B的某个结果,于是停下来,示意B运行;B依言执行,再将结果给A;A再继续操作。 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回,同时其它线程也不能调用这个方法   多线程和异步:多线程可以做不同的事情,涉及到线程通知     &

多线程和同步 : 如进程、线程同步,可理解为进程或线程A和B一块配合,A执行到一定程度时要依靠B的某个结果,于是停下来,示意B运行;B依言执行,再将结果给A;A再继续操作。

所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回,同时其它线程也不能调用这个方法

 

多线程和异步:多线程可以做不同的事情,涉及到线程通知

 

 

   线程同步中的几个概念: 

 

1.使用同步块

synchronized(Object){

 

}

2.synchronized方法

 

3.同步锁Lock   用来锁代码的

Lock lc = new ReentrantLock();

lc.lock();

lc.unlock();

 

 

 

看下面的简单例题:

package com.iteye.com;

public class TestSync implements Runnable {
	  Tmer timer = new Tmer();
	  public static void main(String[] args) {
	    TestSync test = new TestSync();
	    Thread t1 = new Thread(test);
	    Thread t2 = new Thread(test);
	    t1.setName("t1"); 
	    t2.setName("t2");
	    t1.start(); 
	    t2.start();
	  }
	  public void run(){
	    timer.add(Thread.currentThread().getName());
	  }
	}

	class Tmer{
	  private static int num = 0;
	  public  void add(String name){ 
	  	//synchronized (this) {
		    num ++;
		    try {
		    	Thread.sleep(1);
		    } 
		    
		    catch (InterruptedException e) {
		    	
		    }
		    System.out.println(name+", 你是第"+num+"个使用timer的线程");
		  //}
	  }
	}

  很显然没有使用同步锁,会导致这个结果

      同步锁的作用就是在t1执行时,别的线程不能执行,这样才不会导致进程中的数据混乱,出现下面的错误

结果:
t1, 你是第2个使用timer的线程
t2, 你是第2个使用timer的线程

 

 

下面是加同步锁的:

package com.iteye.com;

public class TestSync implements Runnable {
	  Tmer timer = new Tmer();
	  public static void main(String[] args) {
	    TestSync test = new TestSync();
	    Thread t1 = new Thread(test);
	    Thread t2 = new Thread(test);
	    t1.setName("t1"); 
	    t2.setName("t2");
	    t1.start(); 
	    t2.start();
	  }
	  public void run(){
	    timer.add(Thread.currentThread().getName());
	  }
	}

	class Tmer{
	  private static int num = 0;
	  public synchronized void add(String name){ 
	  	//synchronized (this) {
		    num ++;
		    try {
		    	Thread.sleep(1);
		    } 
		    
		    catch (InterruptedException e) {
		    	
		    }
		    System.out.println(name+", 你是第"+num+"个使用timer的线程");
		  //}
	  }
	}

 

运行结果:

 t1, 你是第1个使用timer的线程

t2, 你是第2个使用timer的线程

 

 

 

 

线程同步和异步

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
                 线程 委托 同步异步 的运用 下面是对于invoke的讲解: Control的
进程 线程 多线程 并发 同步异步 很多人对进程,线程,多线程,并发,同步,异步等概念感到困惑,这都是大
c++11 boost技术交流群:296561497,欢迎大家来交流技术。 线程池可以高效的处理任务,线程池中开启
c++11标准给广大c++程序员提供了非常强大的武器库。今天我们就利用c++11中的std::thread 实现一个半
感受: 随着深入学习,现代c++给我带来越来越多的惊喜… c++真的变强大了。 半同步半异步线程池:
用GCD线程组与GCD信号量将异步线程转换为同步线程 有时候我们会碰到这样子的一种情形: 同时获取两个
代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; us
目录: 一、线程同步概述 二、线程同步的使用 三 、总结 一、线程同步概述 前面的文章都是讲创建多
public class TraditionalSychronized { /** * @param args */ public static void main(String[] a
线程同步: 一、线程同步: 线程的同步,就是要保证线程在执行某个计算时,需要保证相关的数据在这个
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号