`

JAVA基础知识回顾-----多线程基础-----随想随写

 
阅读更多

经常会有人问你,什么是进程,什么是线程,进程和线程有什么关系
(区别),所以我觉得还是有必要总结一下的,虽然可能不太好;
1.定义:所谓进程,就是正在进行的程序,每一个进程都有自己独立的一块
内存空间,比如在Windows系统下,一个EXE就是一个进程,可以在任务管理下
查看你运行的所有进程,而针对于此,线程指的是进程中的一个执行流程,
一个进程可以包含多个线程,多个线程共享一片内存空间;
2.线程实现的方式:
  a) 继承Thread类,复写run方法(放置需要采用多线程技术的代码),建立对象
     对象通过start启动多线程
     ep1:
     完整代码:

     package com.ahuiby.test;

class Dog extends Thread{
 public Dog(){}

 @Override
 public void run() {
  // TODO Auto-generated method stub
  for(int i=0;i<5;i++){
   System.out.println(Thread.currentThread().getName()+": "+i);
  }
 }
 
}
public class Test {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Dog d1=new Dog();
  Dog d2=new Dog();
  
  d1.start();
  d2.start();
 }

}

 

    运行结果:

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

 

  b) 继承Runnable,复写run方法(放置需要采用多线程技术的代码),建立对象,将对象作为Thread的参数创建Thread对象
     通过start启动多线程
ep2:
完整代码:

package com.ahuiby.test;

class Dog implements Runnable{
 public Dog(){}

 @Override
 public void run() {
  // TODO Auto-generated method stub
  for(int i=0;i<5;i++){
   System.out.println(Thread.currentThread().getName()+": "+i);
  }
 }
 
}
public class Test {

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Dog d1=new Dog();
  Thread th1=new Thread(d1);
  Dog d2=new Dog();
  Thread th2=new Thread(d2);
  
  th1.start();
  th2.start();
 }

}

 
运行结果:

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

 

  c) 继承Thread类和实现Runnable接口区别
     ①:Thread类不能对同一个对象多次启动线程,即这样产生的后果是不能够实现数据共享,但是可以
      通过同步来解决,而Runnable可以对同一个对象进行多次线程启动,可以直接实现数据共享;这与
      他们创建对象的方式有很大关系;
    Thread创建对象的方式:

  Dog d1=new Dog();
  Dog d2=new Dog();
  
  d1.start();
  d2.start();

 
    Runnable创建对象的方式:

   Dog d1=new Dog();
  Thread th1=new Thread(d1);
  Thread th2=new Thread(d1);
  th1.start();
  th2.start();

 
     ②Java只支持单继承,如果继承了Thread类,该类不能再继承其他类,这限制了类的可扩展性,所以
       在这一点上Runnable还是优于Thread的;
3.每次运行一个Java程序,至少运行了2个线程,一个是main线程,一个是垃圾收集线程
4.线程状态:创建、就绪、运行、阻塞、结束
  a) 创建:新创建一个线程对象
  b) 就绪:调用start()方法以后,如果CPU处于占用状态,该线程必须等待运行中的线程结束或挂起,此时
         线程的状态被称为挂起;
  c) 运行:当线程获得CPU的使用权之后,该状态被称为运行状态
  d) 阻塞:线程因为各种原因而放弃对CPU的使用,暂时停止运行,此时线程所处的状态被称之为阻塞;
     阻塞三种情况:
     ①:等待阻塞:运行中的线程调用wait()方法后,线程进入阻塞状态;
     ②:同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,线程进入阻塞状态;
     ③:其他阻塞:运行的线程执行sleep()或join()方法,或等待用户输入,线程进入阻塞状态;
  e) 结束:线程执行完毕后的状态称之为结束(也叫dead);
5.线程调度的优先级别:
  线程有优先级别,优先级别高的更有机会占有CPU;级别在1-10之间
 

 MAX_PRIORITY:10
  MIN_PRIORITY:1
  NORMAL_PRIORITY:5

 
6.Thread类src中常用方法探索:
  a) 类声明:public
class Thread implements Runnable  从这里
     可以看出Thread类其实也是实现了Runnable接口;也就可以解释
     为什么我们可以通过Runnable接口来实现多线程;
  b) *(预读部分,仅作了解)
    

 /* Make sure registerNatives is the first thing <clinit> does. */
     private static native void registerNatives();

     static {
 
       registerNatives();
 
    } 

      native:在Java中,用native修饰方法的,表示该方法并不是由Java去完成
     而是由C/C++去完成,生成dll文件,由Java来调用;
     registerNatives:这个方法由private修饰,并不会对象直接调用,它是由
     紧跟着的static语句块中调用的;
  c) 字段:
     

    private char        name[];//线程名
     private int         priority;//线程优先级别
     private Runnable target;//即将运行的线程
     public final static int MIN_PRIORITY = 1;//最小优先级
     public final static int MAX_PRIORITY = 10;//最大优先级
     public final static int NORMAL_PRIORITY = 5;//默认优先级

 
     
  d) 方法:

    //对线程名的操作
    //设置线程名:checkAccess():检查线程名是否安全
    public final void setName(String name) {
 
       checkAccess();

       this.name = name.toCharArray();

    }
    //获取线程名
    public final String getName() {

        return String.valueOf(name);

    }
   
   //对线程的优先级别的操作
   //设置线程优先级别
   public final void setPriority(int newPriority) {

        ThreadGroup g;

        checkAccess();

        if (newPriority > MAX_PRIORITY || newPriority < MIN_PRIORITY) {

            throw new IllegalArgumentException();

        }

        if((g = getThreadGroup()) != null) {

            if (newPriority > g.getMaxPriority()) {

                newPriority = g.getMaxPriority();

            }

            setPriority0(priority = newPriority);

        }

    }
   //获取线程的优先级别(final修饰的方法可以被重载,但是不能被覆盖)
   public final int getPriority() {

        return priority;

    }

    
   //覆盖run方法
    @Override

    public void run() {

        if (target != null) {

            target.run();

        }

    }

   //start方法
    public synchronized void start(){//具体代码}
    start被同步锁了,如果其他线程要调用start方法,必须等待当前对象释放锁

  //currentThread获得当前线程
    public static native Thread currentThread();

 //join方法
    public final synchronized void join(long millis)
    throws InterruptedException {
 
        long base = System.currentTimeMillis();

        long now = 0;


        if (millis < 0) {

            throw new IllegalArgumentException("timeout value is negative");

        }


        if (millis == 0) {

            while (isAlive()) {

                wait(0);

            }

        } else {

            while (isAlive()) {

                long delay = millis - now;

                if (delay <= 0) {

                    break;

                }

                wait(delay);

                now = System.currentTimeMillis() - base;

            }

        }

    }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

2
0
分享到:
评论

相关推荐

    Java基础知识培训 Java基础教程-Java基础知识全套PPT课件 共9个章节.rar

    【完整课程列表】 Java基础[01-Java概述].pdf Java基础[02-Java基础语法1].pdf ...Java基础[05-多线程].pdf Java基础[06-集合].pdf Java基础[07-IO].pdf Java基础[08-GUI].pdf Java基础[09-网络编程].pdf

    java基础教程----精华版

    这个"java基础教程----精华版"显然是一份精心整理的资料,旨在帮助初学者快速掌握Java编程的基础知识。下面将详细介绍Java语言的核心概念和关键知识点。 1. **Java语法基础**: - **变量**:在Java中,变量是存储...

    基于java的开发源码-多线程程序死锁检查 JCarder.zip

    基于java的开发源码-多线程程序死锁检查 JCarder.zip 基于java的开发源码-多线程程序死锁检查 JCarder.zip 基于java的开发源码-多线程程序死锁检查 JCarder.zip 基于java的开发源码-多线程程序死锁检查 JCarder.zip ...

    java-java面试题库整理-基础-JVM-线程并发-框架等.zip

    这份"java-java面试题库整理-基础-JVM-线程并发-框架等.zip"文件提供了一个全面的复习资源,帮助求职者准备Java相关的面试。 1. **Java基础知识** - 类与对象:Java是一种面向对象的语言,了解类的定义、构造器、...

    基于java的开发源码-超简单Java多线程填表源码.zip

    基于java的开发源码-超简单Java多线程填表源码.zip 基于java的开发源码-超简单Java多线程填表源码.zip 基于java的开发源码-超简单Java多线程填表源码.zip 基于java的开发源码-超简单Java多线程填表源码.zip 基于java...

    JAVA线程高级-线程按序交替执行

    在Java编程中,多线程是并发编程的重要组成部分,它允许程序同时执行多个任务,从而提高了系统的效率和响应性。...通过熟练掌握上述知识点,开发者可以更好地驾驭Java的多线程环境,实现高效的并发编程。

    基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip

    基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码....

    Java基础[05-多线程]

    Java基础[05-多线程]

    Java 第二阶段提升编程能力【线程(基础)】---- 代码

    Java 第二阶段提升编程能力【线程(基础)】---- 代码 Java 第二阶段提升编程能力【线程(基础)】---- 代码 Java 第二阶段提升编程能力【线程(基础)】---- 代码 Java 第二阶段提升编程能力【线程(基础)】---- ...

    Java开发案例-springboot-61-整合asyncTool京东多线程编排工具-源代码+文档.rar

    Java开发案例-springboot-61-整合asyncTool京东多线程编排工具-源代码+文档.rar Java开发案例-springboot-61-整合asyncTool京东多线程编排工具-源代码+文档.rar Java开发案例-springboot-61-整合asyncTool京东多线程...

    Java基础入门--教学课件--PPT

    Java内置对多线程的支持,可以通过实现Runnable接口或继承Thread类创建线程。 9. **Java应用领域**: Java广泛应用于Web开发(Servlet、JSP)、企业级应用(EJB)、移动应用(Android开发)、大数据处理(Hadoop...

    Java多线程编程总结

    Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-...

    传智播客_Java培训_毕向东_Java基础[05-多线程]

    ### 传智播客_Java培训_毕...以上内容涵盖了Java多线程的基础知识,包括线程的创建、生命周期管理、线程安全以及线程间的通信等内容。通过深入理解这些知识点,可以更好地利用多线程技术提升应用程序的性能和用户体验。

    java常见面试题---线程篇

    在Java编程领域,线程是并发处理的核心概念,它允许程序在同一时间...理解并熟练掌握这些知识点,对于解决Java并发问题和优化多线程应用至关重要。在实际工作中,还需要关注线程安全、性能优化和代码可维护性等问题。

    Java语言程序设计-基础篇-原书第8版

    综上所述,《Java语言程序设计-基础篇-原书第8版》不仅涵盖了Java语言的基础知识,还深入探讨了面向对象编程、类库使用、异常处理、输入输出、多线程和网络编程等高级主题,是一本适合初学者入门和进阶学习的宝贵...

    java多线程同步问题

    多线程注意:wait()方法的调用要有判定条件常用 while () obj.wait(timeout, nanos); ... // Perform action appropriate to condition } synchronized会影响共享数据,但对其他语句的执行不会有规律了!

    多线程相关知识源码-----多线程案例源码

    多线程相关知识源码-----多线程案例源码

    java实现多线程间的同步与互斥(读者写者问题)

    用java实现多线程并发中的读者与写者问题,能够实现多线程对临界资源的同步有序访问。 具体实现为: 给定一个队列A[1-10][1-100000]、元素编号1-10,其中每个元素包含10万个随机数。创建若干个线程,各循环100次;...

Global site tag (gtag.js) - Google Analytics