zoukankan      html  css  js  c++  java
  • Java中的多线程

    Java 中的多线程简介:

      1. Java 中的线程是通过 java.lang.Thread 类来实现的, 每一个 Thread 对象, 代表了一个新的主线程的线程.

      2. Java 虚拟机启动时会有一个由主方法(public static void main(){})所定义的线程.

      3. 可以通过创建 Thread 实例来创建新的线程.

      4. 每个线程都是通过某个特定 Thread 对象所对应的方法 run() 来完成其操作的,方法 run() 称为一个线程体.

      5. 通过调用 Thread 类的 Start() 方法来启动一个线程(每一个 Thread 对象代表一个新的线程).

    线程的启动与创建:

      1. 所定义的线程类实现 Runnable 接口, 然后将其传递给 Thread 的构造函数, 创建一个 Thread 对象(推荐使用此方法):

        ① 定义线程类实现 Runnable 接口;

        ② Thread myThread = new Thread(target) // target 为 实现了 Runnable 的接口类型;

        ③ Runnable 中只有一个方法:public void run(); // 用来定义线程运行体;

        ④ 使用 Runnable 接口可以为多个线程提供共享的数据;

        ⑤ 在实现 Runnable 接口的类的 run 方法中可以使用 Thread 的静态方法:

          public static Thread currentThread(); // 获取当前线程的引用.

      2. 直接继承 Thread 类:

        ① 可以定义一个 Thread 的子类, 并重写 run 方法,如:

          class MyThread extends Thread {

            public void run(){

            }
                     }

        ② 之后生成该类的对象

          MyThread myThread = new MyThread(....);

    Demo_1:

    // 第一种方法:直接实现 Runnable 接口
    class TestThread {
    	public static void main(String[] args){
    		Rnnner r  = new Rnnner();
    		// r.run() 如果直接这样写,就变成了普通方法的调用
    		Thread tt = new Thread(r);
    		tt.start();
    		for(int i = 0; i < 5; i++) {
    			System.out.println("Main Thread------:"+i);
    		}
    	}
    }
    
    class Rnnner implements Runnable {
    	public void run() {
    		for(int i = 0; i < 5; i++) {
    			System.out.println("Runner--------:" + i);
    		}
    	} 
    }
    

     运行结果:

    Main Thread------:0
    Runner--------:0
    Main Thread------:1
    Runner--------:1
    Runner--------:2
    Runner--------:3
    Runner--------:4
    Main Thread------:2
    Main Thread------:3
    Main Thread------:4

    可以从运行结果中看出,二者交替输出,两个线程各执行一会.

    Demo_2:

    // 第二种方法:直接继承 Thread 类
    public class TestThread {
    	public static void main(String[] args) {
    		Runner r = new Runner();
    		r.start();
    		for(int i = 0; i < 6; i++) {
    			System.out.println("Main Thread-----:"+i);
    		}
    	}
    }
    class Runner extends Thread {
    	public void run() {
    		for(int i = 0; i< 8 ; i ++){
    			System.out.println("Runner-----:"+i);
    		}
    	}
    }
    

     运行结果:

    Main Thread-----:0
    Runner-----:0
    Main Thread-----:1
    Runner-----:1
    Main Thread-----:2
    Runner-----:2
    Main Thread-----:3
    Main Thread-----:4
    Main Thread-----:5
    Runner-----:3
    Runner-----:4
    Runner-----:5
    Runner-----:6
    Runner-----:7

    同一个线程类, 可以启动多个线程:

    Demo_3:

    class TT implements Runnable {
    	int count = 0;
    	@Override
    	public void run() {
    		for(int i = 1; i <= 3; i++){
    			System.out.println("Num. " +i);
    			count ++;
    		}
    	}	
    }
    class TestThread {
    	public static void main(String[] args) {
    		TT tt = new TT();
    		Thread t1 = new Thread(tt);
    		Thread t2 = new Thread(tt);
    		t1.start();
    		t2.start();
    		System.out.println("tt.count = "+tt.count);
    	}
    }
    

    运行结果:

    tt.count = 0
    Num. 1
    Num. 1
    Num. 2
    Num. 3
    Num. 2
    Num. 3

    Demo_4:

    class TT implements  Runnable {
    	@Override
    	public void run() {
    		for(int i = 1; i <= 7; i++){
    			if(i % 3 == 0 && i != 0){
    				try {
    					Thread.sleep(2000);
    				} catch (InterruptedException e) {
    				}
    				System.out.println("Num. "+i);
    			}
    		}
    	}
    }
    class TestThread {
    public static void main(String[] args) {
    	TT tt = new TT();
    	Thread t1 = new Thread(tt);
    	t1.start();
    	}
    }
    

     运行结果:

    Num. 3
    Num. 6

  • 相关阅读:
    从零开始学架构(三)UML建模
    【网址收藏】博客园主题美化
    完美解决国内访问GitHub速度太慢的难题
    SpringBoot+slf4j线程池全链路调用日志跟踪 二
    SpringBoot+slf4j实现全链路调用日志跟踪 一
    2021年java最全面试宝典【核心知识整理】
    [中级]系统集成项目管理工程师历年真题及参考答案
    线程池ThreadPoolExecutor最全实战案例
    大厂git分支管理规范:gitflow规范指南
    IdentityServer4
  • 原文地址:https://www.cnblogs.com/bosongokay/p/6822781.html
Copyright © 2011-2022 走看看