线程的创建有两种方式

 package learn.JavaBasics.Class;

 public class ThreadDemo extends Thread {
     private static int count = 1;

     public void run() {
         System.out.println("Thread: "+count+" has started");
         ++count;
     }

     /**
      * @param args
      */
     public static void main(String[] args) {
         // TODO Auto-generated method stub
         ThreadDemo t1 = new ThreadDemo();
         ThreadDemo t2 = new ThreadDemo();
         ThreadDemo t3 = new ThreadDemo();

         new Thread(new Runnable() {

             @Override
             public void run() {
                 // TODO Auto-generated method stub
                 System.out.println("Runnable Thread has started");
             }

         }).start();

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

线程同步

由于一个线程在操作共享数据时,在未执行完毕的情况下,另外的线程也参与进来,导致共享数据存在了安全问题解决方式:1. 同步代码块    synchronized(同步监视器) {      //操作共享数据的代码    }    同步监视器, 由任何一个类的对象来充当,哪个线程获得了监视器,哪个线程才可操作共享数据,俗称:锁    所有线程必须同用一个同步监视器, 即这个类的对象只能有一个(接口的形式使用this大体无碍,继承的方式可能会存在多个对象,慎用this)2. 同步方法    public synchronized void show() {          //操作共享数据的代码    }    此时的同步监视器是当前对象(this), 要注意当前对象是否有多个

线程通信

 package learn.JavaBasics.Class;

 class PrintNum implements Runnable{
     private int num = 1;

     @Override
     public void run() {
         // TODO Auto-generated method stub
         while(num <= 100) {
             synchronized (this) {
                 notify(); //唤醒一个顶部的wait的线程
                 try {
                     Thread.currentThread().sleep(10);
                 } catch (InterruptedException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
                 }
                 System.out.println(Thread.currentThread().getName() + ":" + num);
                 ++num;

                 try {
                     wait();//把本线程wait掉
                 } catch (InterruptedException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
                 }
             }
         }
     }
 }

 public class TestCommunication {
     /**
      * 交替打印1到100的数值
      */
     public static void main(String[] args) {
         // TODO Auto-generated method stub
         PrintNum p = new PrintNum();

         Thread t1 = new Thread(p);
         Thread t2 = new Thread(p);

         t1.setName("A");
         t2.setName("B");

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

线程死锁

java高薪之路__006_多线程的更多相关文章

  1. java架构之路(多线程)JMM和volatile关键字(二)

    貌似两个多月没写博客,不知道年前这段时间都去忙了什么. 好久以前写过一次和volatile相关的博客,感觉没写的那么深入吧,这次我们继续说我们的volatile关键字. 复习: 先来简单的复习一遍以前 ...

  2. java架构之路(多线程)大厂方式手写单例模式

    上期回顾: 上次博客我们说了我们的volatile关键字,我们知道volatile可以保证我们变量被修改马上刷回主存,并且可以有效的防止指令重排序,思想就是加了我们的内存屏障,再后面的多线程博客里还有 ...

  3. java架构之路(多线程)AQS之ReetrantLock显示锁的使用和底层源码解读

    说完了我们的synchronized,这次我们来说说我们的显示锁ReetrantLock. 上期回顾: 上次博客我们主要说了锁的分类,synchronized的使用,和synchronized隐式锁的 ...

  4. java高薪之路__009_网络

    1. InetAddress类2. Socket: IP地址和端口号的结合,socket允许程序把网络连接当成一个流,数据在两个socket间通过IO传输, 通信的两端都要有socket. 主动发起通 ...

  5. java高薪之路__008_Annotation

    元注解 共有4种 @Retention 表示需要在什么级别保存该注释信息(生命周期) |--- RetentionPolicy.SOURCE: 停留在java源文件,编译器被丢掉 |--- Reten ...

  6. java高薪之路__007_反射

    参考地址: 1. http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html2. http://www.cnblogs.com/ ...

  7. java高薪之路__005_IO流

    参考地址: 1. http://blog.csdn.net/yczz/article/details/38761237 File类 ObjectInputStream && Objec ...

  8. java高薪之路__003_集合

    Java集合可分为Collection和Map两大体系 Collection接口 |---- Set: 元素无序.不可重复 |---- List: 元素有序.可重复 (动态数组) |---- Queu ...

  9. java高薪之路__002_异常处理

    自定义异常 package learn.JavaBasics.Class; import java.util.Date; /** * 如何自定义一个异常类 * 1. 继承一个现有的异常类 * 2. 提 ...

随机推荐

  1. html基本的内容

    1.表现各标签的特征 <img>中的src(source)即为属性 属性都是以"属性名 = 值"的形式出现 属性的值建议用引号括起来 属性建议均以键值对的形式括起来 一 ...

  2. http://highscalability.com/blog/2015/5/18/how-mysql-is-able-to-scale-to-200-million-qps-mysql-cluster.html

    http://highscalability.com/blog/2015/5/18/how-mysql-is-able-to-scale-to-200-million-qps-mysql-cluste ...

  3. Flink -- Barrier

    CheckpointBarrierHandler 这个接口用于react从input channel过来的checkpoint barrier,这里可以通过不同的实现来,决定是简单的track bar ...

  4. zepto源码--核心方法5(文本操作)--学习笔记

    涉及到文本内容的主要有三个函数:html, text, val. 我们已经见过多次,一个函数多种用途的情况,今天这三个函数也不例外,既可以获取内容,也可以设置内容.判断条件就是有没有传入参数,如果没有 ...

  5. momentjs 求小时差异

    momentjs  使用 var now1 = moment( moment().unix()*1000); //获取unix时间戳 需要*1000 var befor_time = moment(1 ...

  6. Python常用模块之sys

    Python常用模块之sys sys模块提供了一系列有关Python运行环境的变量和函数. 常见用法 sys.argv 可以用sys.argv获取当前正在执行的命令行参数的参数列表(list). 变量 ...

  7. 优化SQL Sever查询语句的几个要点

    1.不要在Where子句中的“=”左边进行函数.算术运算或其他表达式运算,否则系统将可能无法正确使用索引. 2.尽量不要在Where条件中使用函数,否则将不能利用索引. 3.在Where条件中使用明确 ...

  8. MySql超新手入门

    https://www.kancloud.cn/thinkphp/mysql-tutorial/36457

  9. spring02

    1.在spring容器中的一个bean的整个生命周期 1.启动spring容器 2.bean实例化 3.装配属性 4.BeanNameAware:setBeanName 5.BeanFactoryAw ...

  10. 如何保证App外包的最终质量,不延期不烂尾?

    选择App外包服务的客户,最害怕的就是App项目延期甚至烂尾.投入了巨大的时间和财富,结果最后App无法上线. 解决这个问题有两个方法:第一,在选择公司前,先了解清楚有关App外包的一切问题,做到心里 ...