zoukankan      html  css  js  c++  java
  • Java多线程入门

    Java多线程入门


    线程是操作系统课程中提到的一个概念,是系统调度和分配的最小单元,其自身并不拥有系统资源,但与同属一个进程的其他线程共享进程所拥有的的全部资源。多线程编程可以使得程序共有两条或者两条以上的并发执行线索,即同时完成一个工作的多个部分。

    1. 线程类


    Java中线程有两方面的含义

    • 一条独立执行的线索
    • Thread类或继承了Thread类的对象

    自定义线程类

    • 继承Thread
    class a extends Thread{
        public void run()
        {
    
        }
    }
    
    • 实现Runnable接口
    class b implements Runnable{
         public void run(){    
         
         }
    }
    

    相对而言,第二种方法更好一些,因为Java中只能继承一个类,若是用接口实现自定义线程会更好。

    2. 线程对象


    • 继承Thread
    Thread aa=new a();
    
    • 实现Runnable接口
    b bb=new b();
    

    由于以上类b虽然实现了Runable接口,有多线程功能,然而其本身还不是一个线程,因此还要进行一下转化

    b bb=new b();
    Thread c=new Thread(bb);   //这里使用Thread构造器 public Thread(Runable t)
    

    3. 线程启动


    class b implements Runnable {
    	public void run() {
    		System.out.println("Just a test");
    	}
    }
    
    public class Test {
    	public static void main(String[] args) {
    		b bb = new b();
    		Thread c = new Thread(bb);
    		//c.start();
    		c.start();
    	}
    }
    

    线程对象在一个生命周期(开始之后,结束之前)只能start一次
    不然就会出现如下错误

    4. 多线程启动

    class a implements Runnable {
    	public void run() {
    		for (int i = 0; i < 10; i++) {
    			System.out.println("Just a test a");
    		}
    	}
    }
    
    class b implements Runnable {
    	public void run() {
    		for (int i = 0; i < 10; i++) {
    			System.out.println("Just a test b");
    		}
    	}
    }
    
    public class Test {
    	public static void main(String[] args) {
    		a aa = new a();
    		b bb = new b();
    		Thread c = new Thread(aa);
    		Thread d = new Thread(bb);
    		// c.start();
    		c.start();
    		d.start();
    	}
    }
    

    结果为


    前面先是打印了7个a,之后再是10个b,再是3个a。说明多线程运行时,结果并不是和想象中一致的,操作系统相关知识也有所解释,在操作系统中,线程是CPU调度单位,系统会为每一个线程分配一个时间片,如果某个线程的时间用光了,这个线程就会暂时转入就绪状态。因此上面程序运行的结果也就可以解释了,系统在多线程调度时并不会保证一个线程的启动时间和运行时间,线程可以使交替运行的,多次执行也可能会产生不同的结果。
    再次运行程序,结果为

    5. 线程的简单补充

    • 线程的优先级

    Java中线程的优先级用1~10的整数来进行表示,数值越大优先级越高,默认优先级是5,子线程默认与其父线程的优先级相同

    public class Test {
    	public static void main(String[] args) {
    		a aa = new a();
    		b bb = new b();
    		Thread c = new Thread(aa);
    		Thread d = new Thread(bb);
    		// c.start();
    		c.setPriority(10);
    		c.start();
    		d.start();
    	}
    }
    

    然而值得一提的是,尽管设置线程c的优先级更高,也不能完全保证c就一定会在d之前运行,这只是一个概率高低问题

  • 相关阅读:
    牛客编程巅峰赛S1第8场
    【杭电多校4】2020 Multi-University Training Contest 4
    2020牛客暑期多校训练营(第七场)
    DFS【搜索1】
    2020牛客暑期多校训练营(第六场)
    2020牛客暑期多校训练营(第五场)
    大数模板
    分布式前后端分离项目开发步骤
    Linux 查看服务器硬件信息
    写在前面
  • 原文地址:https://www.cnblogs.com/zsyacm666666/p/6533003.html
Copyright © 2011-2022 走看看