说在前面,经过一段学习过后,自己发觉线程在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()方法即为主线程入口
  产生其他子线程的线程
  必须最后完成执行,因为它执行各种关闭动作

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

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

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

Java线程基础(一)的更多相关文章

  1. Java 线程基础

    Java 线程基础

  2. Java线程基础实例

    概述 Java线程是一个在实战开发中经常使用的基础功能,而在Java中线程相关的类在java.lang和java.util.concurrent里 Thread package thread.base ...

  3. Java线程基础知识(状态、共享与协作)

    1.基础概念 CPU核心数和线程数的关系 核心数:线程数=1:1 ;使用了超线程技术后---> 1:2 CPU时间片轮转机制 又称RR调度,会导致上下文切换 什么是进程和线程 进程:程序运行资源 ...

  4. java线程基础知识----线程与锁

    我们上一章已经谈到java线程的基础知识,我们学习了Thread的基础知识,今天我们开始学习java线程和锁. 1. 首先我们应该了解一下Object类的一些性质以其方法,首先我们知道Object类的 ...

  5. java线程基础知识----线程基础知识

    不知道从什么时候开始,学习知识变成了一个短期记忆的过程,总是容易忘记自己当初学懂的知识(fuck!),不知道是自己没有经常使用还是当初理解的不够深入.今天准备再对java的线程进行一下系统的学习,希望 ...

  6. java线程基础巩固---线程生命周期以及start方法源码剖析

    上篇中介绍了如何启动一个线程,通过调用start()方法才能创建并使用新线程,并且这个start()是非阻塞的,调用之后立马就返回的,实际上它是线程生命周期环节中的一种,所以这里阐述一下线程的一个完整 ...

  7. Java 线程基础知识

    前言 什么是线程?线程,有时被称为轻量进程(Lightweight Process,LWP),是程序执行流的最小单元.一个标准的线程由线程 ID,当前指令指针 (PC),寄存器集合和堆栈组成.另外,线 ...

  8. java 线程基础篇,看这一篇就够了。

    前言: Java三大基础框架:集合,线程,io基本是开发必用,面试必问的核心内容,今天我们讲讲线程. 想要把线程理解透彻,这需要具备很多方面的知识和经验,本篇主要是关于线程基础包括线程状态和常用方法. ...

  9. JAVA线程基础

    一.线程状态 由于参考的维度不一样,线程状态划分也不一样,我这里简单的分为5大类,并且会说明状态变迁的详细过程:

  10. 线程之一:JAVA线程基础

    参考core java,马士兵视频 1.线程的基本概念 (1)一个线程是一个程序内部的顺序控制流. (2)线程和进程 –每个进程都有独立的代码和数据空间(进程上下文),进程切换的开销大. –线程:轻量 ...

随机推荐

  1. linux CentOS

    CentOS中由一般用户切换为root用户 1.打开终端,提示符为“$”,表明该用户为普通用户,此时,直接输su,回车,输入root密码,回车,就可以切换到root用户下,此时的提示符变为“#”. 注 ...

  2. flutter学习之二Material Design设计规范

    前言: 最近在自学flutter跨平台开发,从学习的过程来看真心感觉不是那么一件特别容易的事.不但要了解语法规则, 还要知晓常用控件,和一些扩展性的外延知识,所以套一句古人的话“路漫漫其修远矣,无将上 ...

  3. [dev][dpdk][crypto] dpdk加解密设备与IPSEC

    概述 分三部分,加解密框架(crypto framework),加解密设备(crypto dev),安全协议(Security Framework) ×  API,设计思路等,都在加解密框架里:见文档 ...

  4. Exp3 免杀原理与实践 20164320 王浩

    一.实验内容 1.1 正确使用msf编码器(0.5分),msfvenom生成如jar之类的其他文件(0.5分),veil-evasion(0.5分),加壳工具(0.5分),使用shellcode编程( ...

  5. 学习懈怠的时候,可以运行Qt自带的Demo,或者Delphi控件自带的Demo,或者Cantu书带的源码,运行一下Boost的例子(搞C++不学习Boost/Poco/Folly绝对是一大损失,有需要使用库要第一时间想到)(在六大的痛苦经历说明,我的理论性确实不强,更适合做实践)

    这样学还不用动脑子,而且熟悉控件也需要时间,而且慢慢就找到感觉了,就可以精神抖擞的恢复斗志干活了.或者Cantu书带的源码. 并且可以使用Mac SSD运行Qt的Demo,这样运行速度快一点. 此外, ...

  6. linx下对文件权限设置

    语法格式:chmod u+/-rwx,g+/-rwx,o+/-rwx filename 如:1. 给主人添加读权限,并减去执行权限:chmod u+r,u-x filename2. 给所有用户(主人. ...

  7. ThinkPhp3.2.3 使用phpExcel导入数据

    public function uploadExcel(){ if (!empty($_FILES)){ $upload = new \Think\Upload(); // 实例化上传类 $uploa ...

  8. Java基础(面试题)

    1:面向对象编程有很多重要的特性: 封装,继承,多态和抽象. 2:什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? (1)Java虚拟机是一个可以执行Java字节码的虚拟机进程.J ...

  9. Pocket Gems面经prepare: Diamond and Ruby

    说我有一个背包,有n个格子,一个格子可以放5个钻石,一个钻石10块钱,一个格子可以放5个ruby,一个ruby 5块钱, 一个格子可以放一个装备,一个装备25块钱. 然后给你n个钻石n个ruby n个 ...

  10. 检测U盘插入、拨出状态

    头文件 #include <Dbt.h> 关键代码: LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LP ...