• 进程

    • 操作系统中, 并行执行的任务
  • 线程
    • 进程内部, 并行执行的任务
    • 进程包含线程
  • 线程的创建
    • 继承Thred
      • 定义 Thred 的子类
      • 重写 run() 方法
      • 在 run() 方法中的代码, 是与其他代码并行的代码
      • 线程启动后, 自动执行
      • package day1702_线程;
        
        public class Test1 {
        public static void main(String[] args) { T1 t1 = new T1();
        T1 t2 = new T1(); // 创建线程对象 t1.start(); // 启动线程后, 自动执行
        t2.start(); System.out.println("main"); } static class T1 extends Thread{ // 继承线程
        @Override
        public void run() {
        super.run(); super.setName("thred1");// 设置线程名称 super.getName();// 获取线程名 String n = super.getName(); for (int i = ; i < ; i++) {
        System.out.println(n+": "+i);
        } }
        }
        }


    • 实现 Runnable
      • 定义 Runnable 子类
      • 实现 run() 方法
      • 把 Runnable 对象, 放入Thred 线程对象启动
      • 线程启动后, 执行 Runnable 对象的 Run() 方法
      • package day1702_线程;
        
        public class Test2 {
        public static void main(String[] args) { R1 r1 = new R1();// 创建 R1 对象
        R1 r2 = new R1(); Thread t1 = new Thread(r1); // 创建线程
        Thread t2 = new Thread(r2); t1.start(); // 执行线程
        t2.start(); } static class R1 implements Runnable{
        @Override
        public void run() { // 获得 正在执行这行代码的线程对象
        Thread t = Thread.currentThread(); // 获得线程名
        String n = t.getName();
        for (int i = ; i < ; i++) {
        System.out.println(n+": "+i);
        }
        }
        } }
  •  线程的状态
    • 新生
    • 可执行
    • 阻塞
    • 执行
    • 消亡   即run()结束
  • 线程的方法
    • Thread.currentThread(); // 获得正在执行这行代码的线程对象 
    • Thread.sleep(毫秒值)    // 当前线程暂停指定的毫秒时间  
    • iterrupt() 
      • 打断一个线程的暂停状态,  被打断的线程会出现异常
      • InterruptedException
    • package day1702_线程;
      
      import java.text.SimpleDateFormat;
      import java.util.Date;
      import java.util.Scanner; public class Test3 {
      public static void main(String[] args) {
      T1 t1 = new T1();
      t1.start(); // main 线程 打断t1 线程的暂停状态
      System.out.println("按回车打断 t 线程");
      new Scanner(System.in).nextLine(); t1.interrupt(); // 打断
      } static class T1 extends Thread{
      @Override
      public void run() {
      // TODO Auto-generated method stub
      super.run(); SimpleDateFormat sdf =
      new SimpleDateFormat("HH:ss:mm"); while (true) {
      String s = sdf.format(new Date());
      System.out.println(s); // 停一秒
      try {
      Thread.sleep();
      } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace(); System.out.println("谁TMD桶我");
      break; } } }
      }
      }


    • join(); //当前线程,等待被调用的线程结束
    • package day1702_线程;
      
      public class Test4 {
      public static void main(String[] args) throws InterruptedException {
      // 1000万内的质数数量 System.out.println(" 单线程");
      f1();
      System.out.println("五个线程");
      f2(); } private static void f1() throws InterruptedException {
      long t = System.currentTimeMillis(); T1 t1 = new T1(,);
      t1.start(); // 让main 线程等待 t1 结束
      t1.join();
      int r = t1.count; t = System.currentTimeMillis() - t;
      System.out.println("执行时间: "+t);
      System.out.println("质数数量: "+r);
      } private static void f2() throws InterruptedException {
      // TODO Auto-generated method stub
      long t = System.currentTimeMillis(); T1[] a = new T1[];
      for (int i = ; i < a.length; i++) {
      a[i] = new T1(*i,*(i+));
      a[i].start();
      } int sum = ;
      for (T1 t1 : a) {
      t1.join();
      sum+=t1.count;
      } t = System.currentTimeMillis() - t;
      System.out.println("执行时间: "+t);
      System.out.println("质数数量: "+sum);
      } static class T1 extends Thread{ int from;
      int to;
      int count; //最终结果,质数的数量 public T1(int from, int to) {
      if (from <= ) {
      count = ;
      from = ;
      } this.from = from;
      this.to = to;
      } @Override
      public void run() {
      // TODO Auto-generated method stub
      super.run(); for (int i = from; i < to; i++) {
      if (isPrime(i)) {
      count++;
      }
      } } // 是否是质数
      private boolean isPrime(int i) {
      double max = +Math.sqrt(i);
      for (int j = ; j < max; j++) {
      if (i%j == ) {
      return false;
      }
      } return true;
      } }
      }
    • Thread.yield();
      • 当前线程放弃时间片, 让出 cpu 资源
    • getPriority(),  setPriority();
      • 优先级, 1到10, 默认5
    • setDaemon(true);
      • 后台线程,守护线程
      • 一般所有前台线程结束,虚拟机自动退出
      • package day1702_线程;
        
        import java.text.SimpleDateFormat;
        import java.util.Date;
        import java.util.Scanner; public class Test3 {
        public static void main(String[] args) {
        T1 t1 = new T1();
        t1.start(); Thread t2 = new Thread() {
        @Override
        public void run() {
        // TODO Auto-generated method stub
        super.run(); System.out.println("按回车打断 t 线程");
        new Scanner(System.in).nextLine(); t1.interrupt(); // 打断
        }
        }; t2.setDaemon(true); // 设置后台线程
        t2.start();
        } static class T1 extends Thread{
        @Override
        public void run() {
        // TODO Auto-generated method stub
        super.run(); SimpleDateFormat sdf =
        new SimpleDateFormat("HH:ss:mm"); for (int i = ; i < ; i++) {
        String s = sdf.format(new Date());
        System.out.println(s); // 停一秒
        try {
        Thread.sleep();
        } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace(); System.out.println("谁TMD桶我");
        break; }
        } }
        }
        }
  • 多线程的数据访问冲突
    • 多个线程, 共享访问数据
    • 一个线程访问到修改的一半的数据,称为 脏数据
  •  线程同步 synchronized
    • 多个线程,步调一致的执行
    • 让多个线程, 争夺同一个对象的  同步锁
    • 谁抢到谁执行, 抢不到等待
    • 同步锁
      • 任何对象, 都有一个唯一的同步锁
    • synchronized
      • 遇到同步关键字, 要先抢到锁才能执行,否则等待
    • synchronized(对象){  }
      • 争夺指定对象的锁
    • package day1702_线程;
      
      import java.util.Arrays;
      
      public class Test5 {
      
          static char[] a = {'-','-','-','-'};
      static char v = '*'; public static void main(String[] args) {
      new Thread() {
      @Override
      public void run() {
      // TODO Auto-generated method stub
      super.run(); while (true) { // 数组同步锁
      synchronized (a) {
      for (int i = ; i < a.length; i++) {
      a[i] = v;
      }
      v = (v=='*'?'-':'*');
      } }
      }
      }.start(); new Thread() {
      @Override
      public void run() {
      // TODO Auto-generated method stub
      super.run(); while (true) {
      // 数组同步锁
      synchronized (a) {
      System.out.println(Arrays.toString(a));
      } }
      }
      }.start();
      }
      }


    • synchronized void f() {  };
      • 抢当前对象的锁
    • package day1702_线程;
      
      public class Test6 {
      public static void main(String[] args) { R1 r1 = new R1(); Thread t1 = new Thread(r1);
      t1.start(); // main 线程死循环 ,检查 i 是否是奇数
      while (true) { int i = r1.get();
      if (i%==) {
      System.out.println(i);
      System.exit();// 关闭虚拟机 } }
      } static class R1 implements Runnable{ static int i; synchronized public void add(){
      i++;
      i++;
      } synchronized public int get() {
      return i;
      } @Override
      public void run() {
      // TODO Auto-generated method stub
      while (true) {
      add();
      }
      }
      }
      }


    • static synchronized void f() { };
      • 抢类的锁
    • package day1702_线程;
      
      public class Test6 {
      public static void main(String[] args) { R1 r1 = new R1();
      R1 r2 = new R1(); Thread t1 = new Thread(r1);
      t1.start(); Thread t2 = new Thread(r2);
      t2.start(); // main 线程死循环 ,检查 i 是否是奇数
      while (true) { int i = r2.get();
      if (i%==) {
      System.out.println(i);
      System.exit();// 关闭虚拟机 } }
      } static class R1 implements Runnable{ static int i; static synchronized public void add(){
      i++;
      i++;
      } static synchronized public int get() {
      return i;
      } @Override
      public void run() {
      // TODO Auto-generated method stub
      while (true) {
      add();
      }
      }
      }
      }


java - day017 - 线程的更多相关文章

  1. java之线程

    java之线程 一:线程: 线程是什么呢?线程,有时被称为轻量级进程是程序执行流的最小单元.一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成.另外,线程是进程中的一个实体,是被系统 ...

  2. Java 使用线程方式Thread和Runnable,以及Thread与Runnable的区别

    一. java中实现线程的方式有Thread和Runnable Thread: public class Thread1 extends Thread{ @Override public void r ...

  3. Java的线程安全

    线程安全 我们这里讨论的线程安全,就限定于多个线程之间存在共享数据访问这个前提,因为如果一段代码根本不会与其他线程共享数据,那么从线程安全的角度来看,程序是串行执行还是多线程执行对它来说是完全没有区别 ...

  4. 深入理解Java之线程池

    原作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本文归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...

  5. java中线程分两种,守护线程和用户线程。

    java中线程分为两种类型:用户线程和守护线程. 通过Thread.setDaemon(false)设置为用户线程: 通过Thread.setDaemon(true)设置为守护线程. 如果不设置次属性 ...

  6. java 多线程—— 线程让步

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  7. java 多线程—— 线程等待与唤醒

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  8. Java的线程模型

    并发不一定要依赖多线程(如PHP中很常见的多进程并发),但是在Java里面谈论并发,大多数都与线程脱不开关系. 线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开, ...

  9. Java多线程 - 线程状态

    转自: http://www.cnblogs.com/lwbqqyumidi/p/3804883.html 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的 ...

随机推荐

  1. django.db.utils.OperationalError: (1251, 'Client does not support authentication protocol requested by server; consider upgrading MySQL client')

    1.打开MySQL: cmd里 net start mysql mysql -hlocalhost -uroot -p回车 进入mysql数据库 2. 命令如下: 1.use mysql; 2.alt ...

  2. DBGrid 单击弹出PickList

    type   myGrid = class(TCustomGrid)   end; type   myInplaceEditList = class(TInplaceEditList)   end; ...

  3. 【linux学习笔记三】链接命令

    链接命令:ln link =============华丽的分割线============= ln又有软链接和硬链接 //硬链接特征(不建议创建硬链接) 1.拥有相同的i节点和存储block块,可以看做 ...

  4. python解析本地HTML文件

    Python使用爬虫技术时,每运行一次,本地都会访问一次主机.为避免完成程序前调试时多次访问主机增加主机负荷,我们可以在编写程序前将网页源代码存在本地,调试时访问本地文件即可.现在我来分享一下爬取资料 ...

  5. 你应该知道的4个DSP开发支持库

    引言 在dsp开发中,为了节省开发时间和难度,TI将一些成熟的算法封装为模块,供开发者使用.如果能充分利用这些算法支持库,对于加快dsp开发进程与提高代码质量.稳定性有非常大的帮助. Digital ...

  6. kafka生产者消费者

    import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.consumer.Co ...

  7. ~request库的使用

    官方文档: (中文)http://cn.python-requests.org/zh_CN/latest/ (英文)https://2.python-requests.org//en/master/a ...

  8. 【HC89S003F4开发板】 1环境搭建

    HC89S003F4开发板环境搭建 一.概述 芯圣电子做活动,一个开发板只用一块钱,买过来玩玩.︿( ̄︶ ̄)︿ 全套资料可以在论坛或qq群里下载.总之先安装个环境先. 二.安装Keil C51 作为增 ...

  9. Python2和3字符编码的区别

    Python2和3字符编码的区别 一.字符编码应用之Python 1.1 执行Python程序的三个阶段 Python test.py(我再强调一遍,执行test.py的第一步,一定是先将文件内容从硬 ...

  10. Smart3D飞控&地方坐标系

    资源 ContextCapture(原Smart3D)教程 | Wish3D 航测数据处理答疑55问!涉及CC.Pix4D.Photoscan.EPS等常见软件问题_云进行 飞控软件 Smart3D常 ...