zoukankan      html  css  js  c++  java
  • Java学习随笔5:Java多线程编程

    1. 线程是程序中单独顺序的控制流,线程本身依靠程序进行运行,线程是程序中的顺序控制流,只能使用分配给程序的资源和环境。

    2. 进程是执行中的程序,一个进程可以包含一个或多个线程,但至少要包含一个线程。

    3. 单线程是程序中只存在一个线程,实际上主方法就是一个主线程;多线程是在一个程序中运行多个任务,其目的是更好的使用CPU资源。

    4. 在Java中,线程的实现有两种:继承Thread类和实现Runnable接口。Thread类是在java.lang包中定义的,继承Thread类必须重写run()方法。

      例1:继承Thread类的线程

    class MyThread extends Thread{
        private String name;
        public MyThread(String name){
            this.name = name;
        }
        
        @Override
        public void run() {
            for(int i = 0; i < 10; i++){
                System.out.println(name+":"+i);
            }
            super.run();
        }
    }
    public class ThreadDemo01 {
        public static void main(String[] args) {
            MyThread t1 = new MyThread("A");
            MyThread t2 = new MyThread("B");
            
            // 线程的启动是通过start方法
            t1.start();
            t2.start();
        }
    }

      例2:实现Runnable接口

    class MyRunnable implements Runnable{
    
        private String name;
        public MyRunnable(String name){
            this.name = name;
        }
        
        @Override
        public void run() {
            for(int i = 0; i < 100; i++){
                System.out.println(name+":"+i);
            }
        }
        
    }
    public class ThreadDemo02 {
        public static void main(String[] args) {
            MyRunnable r1 = new MyRunnable("A");
            MyRunnable r2 = new MyRunnable("B");
            
            Thread t1 = new Thread(r1);
            Thread t2 = new Thread(r2);
            
            t1.start();
            t2.start();
        }
    }

    5. 线程的状态

      (1) 创建状态:准备好了一个多线程的对象

      (2) 就绪状态:调用了start()方法,等待CPU进行调度

      (3) 运行状态:执行run()方法

      (4) 阻塞状态:暂时停止执行,可能将资源交给其他线程使用

      (5) 终止状态:线程销毁

    6. 线程的常用方法

      (1) getName():取得线程名称

      (2) currentThread():取得当前线程对象

      (3) isAlive():判断线程是否启动

      (4) join():线程的强制运行

      (5) sleep():线程的休眠

      (6) yield():线程的礼让

      例1:前五种方法的使用:

    class RunnableDemo implements Runnable{
        private String name;
        public RunnableDemo(String name){
            this.name = name;
        }
        
        public void run(){
            for(int i = 0; i < 10; i++){
                try {
                    // 1s执行一次
                    Thread.sleep(1000);
                    System.out.println(name+":"+Thread.currentThread().getName());
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
    public class ThreadDemo03 {
        public static void main(String[] args) {
            RunnableDemo rd1 = new RunnableDemo("A");
            Thread t1 = new Thread(rd1);
            //System.out.println(t1.isAlive());
            t1.start();
            //System.out.println(t1.isAlive());
            
            // 强行执行
            for(int i = 0; i < 10; i++){
                if(i > 5){
                    try {
                        t1.join();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("主线程:"+i);
            }
            
            RunnableDemo rd2 = new RunnableDemo("B");
            Thread t2 = new Thread(rd2);
            t2.start();
            
        }
    }

      其结果为:

    主线程:0
    主线程:1
    主线程:2
    主线程:3
    主线程:4
    主线程:5
    A:Thread-0
    A:Thread-0
    A:Thread-0
    A:Thread-0
    A:Thread-0
    A:Thread-0
    A:Thread-0
    A:Thread-0
    A:Thread-0
    A:Thread-0
    主线程:6
    主线程:7
    主线程:8
    主线程:9
    B:Thread-1
    B:Thread-1
    B:Thread-1
    B:Thread-1
    B:Thread-1
    B:Thread-1
    B:Thread-1
    B:Thread-1
    B:Thread-1
    B:Thread-1

      例2:礼让的使用

    class RunnableDemo02 implements Runnable{
        private String name;
        public RunnableDemo02(String name){
            this.name = name;
        }
        
        @Override
        public void run(){
            for(int i = 0; i < 10; i++){
                System.out.println(name+":"+i);
                if(i == 4){
                    System.out.println("礼让");
                    // 线程的礼让
                    Thread.yield();
                }
                
            }
        }
    }
    public class ThreadDemo04 {
        public static void main(String[] args) {
            RunnableDemo02 r1 = new RunnableDemo02("A");
            RunnableDemo02 r2 = new RunnableDemo02("B");
            Thread t1 = new Thread(r1);
            Thread t2 = new Thread(r2);
            
            t1.start();
            t2.start();
        }
    }

    7. 线程的优先级,不一定会影响线程的执行顺序

      优先级顺序设置:1-MIN-PRIORITY; 10-MAX-PRIORITY; 5-NORM-PRIORITY,默认值是5。

    class RunnableDemo03 implements Runnable{
    
        @Override
        public void run() {
            for(int i = 0; i < 5; i++){
                try {
                    Thread.sleep(1000);
                    System.out.println(Thread.currentThread().getName()+":"+i);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        
    }
    public class ThreadDemo05 {
        public static void main(String[] args) {
            Thread t1 = new Thread(new RunnableDemo03(),"A");
            Thread t2 = new Thread(new RunnableDemo03(),"B");
            Thread t3 = new Thread(new RunnableDemo03(),"C");
            t1.setPriority(Thread.MIN_PRIORITY);
            t2.setPriority(Thread.NORM_PRIORITY);
            t3.setPriority(Thread.MAX_PRIORITY);
            
            t1.start();
            t2.start();
            t3.start();
        }
    }

    8. 同步

      例1:同步代码块

    class MyThread2 implements Runnable{
        private int ticket = 5;
        public void run(){
            for(int i = 0; i < 10; i++){
                synchronized(this){
                    if(ticket > 0){
                        try {
                            Thread.sleep(500);
                            System.out.println(Thread.currentThread().getName()+":"+ticket--);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }
    public class ThreadDemo06 {
        public static void main(String[] args) {
            MyThread2 m = new MyThread2();
            Thread t1 = new Thread(m);
            Thread t2 = new Thread(m);
            Thread t3 = new Thread(m);
            t1.start();
            t2.start();
            t3.start();
        }
    }

      例2:同步方法

    class MyThread2 implements Runnable{
        private int ticket = 5;
        public void run(){
            for(int i = 0; i < 10; i++){
                method();
            }
        }
        
        public synchronized void method(){
            if(ticket > 0){
                try {
                    Thread.sleep(500);
                    System.out.println(Thread.currentThread().getName()+":"+ticket--);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    public class ThreadDemo06 {
        public static void main(String[] args) {
            MyThread2 m = new MyThread2();
            Thread t1 = new Thread(m);
            Thread t2 = new Thread(m);
            Thread t3 = new Thread(m);
            t1.start();
            t2.start();
            t3.start();
        }
    }

    9. 线程的生命周期

  • 相关阅读:
    leetcode 350. Intersection of Two Arrays II
    leetcode 278. First Bad Version
    leetcode 34. Find First and Last Position of Element in Sorted Array
    leetcode 54. Spiral Matrix
    leetcode 59. Spiral Matrix II
    leetcode 44. Wildcard Matching
    leetcode 10. Regular Expression Matching(正则表达式匹配)
    leetcode 174. Dungeon Game (地下城游戏)
    leetcode 36. Valid Sudoku
    Angular Elements
  • 原文地址:https://www.cnblogs.com/mengrennwpu/p/4925643.html
Copyright © 2011-2022 走看看