zoukankan      html  css  js  c++  java
  • Java线程基础(一)

        说在前面,经过一段学习过后,自己发觉线程在Java中占有举足轻重的地位,总觉得如此复杂的线程知识点一定要好好理清才好消化,因而有了这篇文章。

        但因鄙人资历尚浅,如有遗漏错误之处还请广大网友不吝赐教。

    ——————————————————————————————我是分割线————————————————————————————————

        首先让我们来梳理一下知识点,理清好脉络才好做题!

    一、线程基本概念

      我们先来了解一下什么是线程。

      要解释线程,就必须明白什么是进程,那什么是进程呢?如果学过操作系统的同学应该知道:

        进程是指运行中的应用程序,每个进程都有自己独立的地址空间(内存空间),比如用户点击桌面的IE浏览器,就启动了一个进程,操作系统就会为该进程分配独立的地址空间。当用户再次点击左面的IE浏览器,又启动了一个进程,操作系统将为新的进程分配新的独立的地址空间。目前操作系统都支持多进程。

      要点:用户每启动一个进程,操作系统就会为该进程分配一个独立的内存空间。请注意是独立的内存空间。

        在明白进程后,就比较容易理解线程的概念。

        线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。线程有就绪、阻塞和运行三种基本状态。

    线程的特点:

    1、线程是轻量级的进程

    2、线程没有独立的地址空间(内存空间)

    3、线程是由进程创建的(寄生在进程)

    4、一个进程可以拥有多个线程-->这就是我们常说的多线程编程

    5、线程有几种状态:

      a、新建状态(new)

      b、就绪状态(Runnable)

      c、运行状态(Running)

      d、阻塞状态(Blocked)

      e、死亡状态(Dead)

    Just like this!

    BINGO!

      刚才我们讲到了线程的四大特点,其中最后一条是说一个进程中可以包含多条线程,我们称这样的线程叫多线程。

    那么问题来了,

    什么是多线程呢?

      如果在一个进程中同时运行了多个线程,用来完成不同的工作,则称之为“多线程”。
    其中最值得我们注意的是:多个线程实际上是交替占用CPU资源,而非我们表面看起来的并行执行。

    多线程的好处

    •   充分利用CPU的资源
    •   简化编程模型
    •        带来良好的用户体验

    好了,了解了基本知识点之后我们来介绍介绍Java中有关线程创建常用到的类

    线程的创建

    首当其冲的要说的便是我们的Thread类

      Java提供了java.lang.Thread类支持多线程编程

    这是一种最简单的创建线程的方法,值得注意的是这里的类是继承了Thread父类的。

    public class ThreadDemo extends Thread{
    	@Override
    	public void run() {
    		for(int i=0;i<=20;i++){
    			System.out.println(i+".你好,来自线程"+
    		Thread.currentThread().getName());
    		}
    	}
    	public static void main(String[]args){
    	ThreadDemo t1=new ThreadDemo();
    	t1.start();//线程的启动方法
    	ThreadDemo t2=new ThreadDemo();
    	t2.start();
    	}
    }
    

      

      直接new明显是一个简单快捷的办法,但有时候我们为了传入某种参数或是为了约束对象类型往往会在new ***()中加入我们的参数或类型名称,这些也是应当掌握的,在稍后面的代码中会有关于这一现象的描述。

      除了使用直接继承Thread类以外,我们还可以定义MyRunnable类实现Runnable接口,然后完成以下四步操作即可

      1. 实现run()方法;
      2. 编写线程执行体;
      3. 创建线程对象;
      4. 调用start()方法启动线程。
    public class RunnableDemo implements Runnable {
    	@Override
    	public void run() {
    		for(int i=0;i<=100;i++){
    			System.out.println(Thread.currentThread().getName()+"-->"+i);
    		}
    	}
    	public static void main(String[] args) {
    		RunnableDemo rd1=new RunnableDemo();
    		Thread t1=new Thread(rd1);
    		t1.start();
    		RunnableDemo rd2=new RunnableDemo();
    		Thread t2=new Thread(rd2);
    		t2.start();
    	}
    }
    

      看起来是不是比Thread类更复杂一点呢,其实也就是在new完RunnableDemo之后还要将这一新建对象放进Thread方法中。

    那么,这两者的区别又是什么呢?

    一、继承Thread类
      编写简单,可直接操作线程
      适用于单继承
    二、实现Runnable接口
      避免单继承局限性
      便于共享资源

    虽然创建了诸多线程,但是如果没有主线程的运行仍然只是一条没有梦想的咸鱼(笑)

    主线程
      main()方法即为主线程入口
      产生其他子线程的线程
      必须最后完成执行,因为它执行各种关闭动作

    好了,有了主线程的帮助,我们的线程终于能够跑起来了,但会不会有其他的异常出现,或者还有没有其他更复杂的线程实例,

    由于学习上的其他事情,我决定下次有时间再写,欢迎关注我,我将持续更新学习进度!做一个有梦想的咸鱼!

    ——————————————————未完待续——————————————————————————————————

  • 相关阅读:
    [HAOI2006] 数字序列
    [HAOI2012] 外星人
    [HAOI2012] 高速公路
    [HAOI2007] 覆盖问题
    [HAOI2007] 分割矩阵
    [HAOI2007] 上升序列
    牛客练习赛58 D 迷宫
    牛客练习赛58 F XOR TREE
    牛客练习赛58 E 最大GCD
    牛客练习赛58 C 矩阵消除游戏
  • 原文地址:https://www.cnblogs.com/SUN99bk/p/10574512.html
Copyright © 2011-2022 走看看