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. 线程的生命周期

  • 相关阅读:
    树莓派的入网方式和远程连接
    数据结构与算法之递归(C++)
    c++中字符串输入注意的问题
    基于视觉的机械臂分拣(二)
    基于视觉的机械臂分拣(一)
    数据结构与算法之折半查找(C++)
    数据结构与算法之顺序查找(C++)
    ROS之USB摄像头识别二维码问题解决
    机械臂开发之正运动学
    利用vs pcl库将多个PCD文件合并成一张PCD地图
  • 原文地址:https://www.cnblogs.com/mengrennwpu/p/4925643.html
Copyright © 2011-2022 走看看