• java 多线程 1 : 基础


    进程和线程:  一个程序运行后至少有一个进程,一个进程里面可以包含多个线程,但是至少要包含一个线程。

    线程的创建和启动:

    方式1:继承Thread类创建线程类,步骤
         1.定义Thread类的子类,重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务,因此run()方法也被称为线程执行体
         2.创建Thread子类的实例,即创建了线程对象
         3.调用线程对象的start()方法来启动该线程

    public class Thread1 extends Thread{
        private int i;
        @Override
        public void run() {
            for( ; i < 100 ; i++) {
                System.out.println(getName() + "-----" + i);
            }
        }
        
        public static void main(String[] args) {
            for(int i = 0; i<100; i++) {
                System.out.println(Thread.currentThread().getName() + " -- " + i);
                if(i == 20) {
                    new Thread1().start();
                    new Thread1().start();
                }
            }
        }
    }

    注意:main()方法的方法体就是主线程的线程体
       Demo中i为Thread1的实例变量,但因为程序每次创建线程对象都需要创建一个Thread1对象,两个线程是不会共享该实例变量的 , 强调这一点,是想和方式2做比较,加深理解。

    方式2:实现Runnable接口创建线程类,步骤
         1.定义Runnable接口的实现类,重写该类的run()方法,run()方法为该线程的线程执行体
         2.创建Runnable实现类的实例,并以此实例作为Thread的Target来创建Thread对象,该Thread对象才是真正的线程对象
         3.调用线程对象的start()方法来启动该线程

    public class Thread2 implements Runnable{
        private int i;
        @Override
        public void run() {
            for( ; i < 100; i ++) {
                //
                System.out.println(Thread.currentThread().getName() + " -- " + i);
            }
        }
        
        public static void main(String[] args) {
            for(int i = 0 ; i < 100 ; i++) {
                System.out.println(Thread.currentThread().getName() + " -- " + i);
                if(i == 20) {
                    Thread2 th = new Thread2();
                    new Thread(th , "线程1").start();
                    new Thread(th , "线程2").start();
                }
            }
        }
    }

    注意:调用getName的方式必须是通过Thread.currentThread.getName(),因为Runnable对象只能作为线程对象的target
       运行demo可以看到,两个子线程的i变量是连续的,也就是采用runnale接口方式创建的多个线程可以共享线程类的实例变量,程序创建的Runnable对象只是线程的target,而多个线程,可以共享一个target,所以,多个线程可以共享一个线程类(实际上应该是线程的target类)的实例变量。

         

    方式3:使用Callable 和 Future 创建线程:

    实际运用过程中使用方式2和方式3比较多 , 1. 单继承,多实现 , 2. 多个线程可以共享一个target对象,所以非常适合多个线程来出来同一份资源得情况   

    温故而知新
  • 相关阅读:
    蠢货之对闭包表的扩展
    蠢货之TaskCompletionSource 带事件的同步调用
    SQLSERVER新建存储过程模板
    缓存更新
    写给”源码爱好者“
    区块链-一个不神秘却总能骗人的东西
    graceful-upgrades-in-go
    谁也逃不过C++
    Go的问题
    面试
  • 原文地址:https://www.cnblogs.com/Uzai/p/9663359.html
Copyright © 2020-2023  润新知