zoukankan      html  css  js  c++  java
  • thread

    创建线程的两种方式:

    线程的实现依靠run()方法中的线程体

    创建线程类继承Thread类并实现run()方法,以此来创建

    • 第一个线程类:
      package com.zrm.threadFirst;

      public class Thread_one extends Thread{
      @Override
      public void run() {
      for (int i=0;i<1000000;i++){
      try {
      Thread.sleep(1000);
      } catch (InterruptedException e) {
      e.printStackTrace();
      }
      System.out.println("111111111");
      }
      }
      }
    • 第二个线程类:
    • package com.zrm.threadFirst;

      public class ThreadTwo extends Thread{
      @Override
      public void run() {
      for (int i=0;i<1000000;i++){
      try {
      Thread.sleep(1000);
      } catch (InterruptedException e) {
      e.printStackTrace();
      }
      System.out.println("222222222");
      }
      }
      }
    • 在一个主类中执行两个线程:
    package com.zrm;

    import com.zrm.threadFirst.ThreadTwo;
    import com.zrm.threadFirst.Thread_one;

    public class Main {
    public static void main(String[] args) {
    //实例两个线程对象
    Thread_one th1 = new Thread_one();
    ThreadTwo th2 = new ThreadTwo();
    //启动线程
    th1.start();
    th2.start();
    }


    }执行如下:

    第二种方法:创建runner类实现Runnable接口并且实现run()方法(线程体)

    package com.zrm.threadSecond;

    public class Runner_one implements Runnable{
    @Override
    public void run() {
    for (int i=0;i<1000000;i++){
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    System.out.println("111111111");
    }
    }
    }

    package com.zrm.threadSecond;

    public class Runner_two implements Runnable{
    @Override
    public void run(){
    for (int i=0;i<1000000;i++){
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    System.out.println("222222222");
    }
    }
    }

    执行:
    package com.zrm.threadSecond;

    /**
    * 第二种创建多线程的方法,实现Runnable接口
    */
    public class Main {
    public static void main(String[] args) {
    //创建实现runnable接口run方法(线程体)的对应两个对象
    Runner_one run1 = new Runner_one();
    Runner_two run2 = new Runner_two();
    //创建连个线程对象
    Thread th1 = new Thread(run1);
    Thread th2 = new Thread(run2);
    //启动线程
    th1.start();
    th2.start();
    }
    }
    结果:

     线程礼让:Thread.yield();

    线程安全:

    synchronized(){
    }
    解决办法,


    StringBuilder和StringBuffer类可以解决String字符串如果频繁修改浪费内存空间的问题,String直接修改是重新开辟空间再指向,而前两个是在原空间内进行操作的,StringBuilder会出现线程安全问题,而StringBuffer不会


  • 相关阅读:
    mybatis plus 执行sql
    springboot 打印 mybatisplus 的sql
    easyexcel 简单使用
    springboot ehcache
    easyexcel 时间转换
    springboot stopwatch
    c# 开机自动启动
    sqlHelper
    DirectX录音
    c# 发邮件
  • 原文地址:https://www.cnblogs.com/zrmj/p/11429330.html
Copyright © 2011-2022 走看看