1,进程和线程的基本概念:

1.什么是进程:
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。(百度百科)
进程其实就是我们计算机上正在运行的程序。
 
2.什么是线程:
线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
 
3.什么是多线程:
(1),概念:通俗的来说,多线程就是指多个线程并发执行的情况。
(2),原理:
多线程是如何做到的:
CPU把一段时间划分为多个很小的时间片段,然后让每个线程获得这些片段的执行权限,由于CPU的速度非常快,所以给人的感觉就像是同时运行一样。现在的计算机,的确是可以做到同时运行的,为什么呢?因为现在的计算机大多数都是多核的。
 

2、java中多线程的使用:Thread

构造:

  • new Thread()

启动一个新的线程:

  • .start()

常用方法:

  • Thread.currentThread().getName() //获取当前线程的名字
/**
* @ClassName MyThreadExample
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/19.
*/
public class MyThreadExample {
private static class MyFirstThread extends Thread{
//自己写个线程,重写run()方法
@Override
public void run() {
System.out.println("MyFirstThread运行中:名字是:" + Thread.currentThread().getName());
}
}
public static void main(String[] args) {
MyFirstThread myFirstThread = new MyFirstThread();
myFirstThread.run();//在当前线程中调用run()方法;不会产生新的线程
myFirstThread.start();
System.out.println("main方法中运行的线程名字:" + Thread.currentThread().getName());
/**
* 运行输出:
* main方法中运行的线程名字:main
* MyFirstThread运行中:名字是:Thread-0
*/
}
}
线程运行具有随机性:

可以看出每次运行顺序不一样

线程的运行具有随机性。为什么是这样?那我们来讲讲调用了start()方法之后,产生了什么:
  • (1),调用start()之后,程序会通知我们的JVM,告诉jvm我已经准备好了,可以运行了。
  • (2),Jvm异步的调用我们的线程对应的run()方法。
  • (3),Jvm什么时候运行我们的run()方法,这个是程序员没法控制的(其实呢,还是可以相对的控制,这个之后讲,但是,你要做到绝对的控制它马上运行,还是不行)
  • (4),start()方法的调用顺序,不代表线程的run()方法的运行顺序。

3、Thread实现了Runnable接口,通过实现Runnable接口的方式来实现一个线程

Thread 类实现了Runnable接口,该接口只有有一个抽象方法run()

  Thread 类构造方法可以传入一个Runnable接口实现类来构造线程实例:

示例代码:

/**
* @ClassName UseRunnableThread
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/19.
*/
public class UseRunnableThread {
private static class MyRunnableThread implements Runnable { @Override
public void run() {
System.out.println("MyRunnableThread" + Thread.currentThread().getName());
}
} public static void main(String[] args) {
Thread thread = new Thread(new MyRunnableThread());
//lambda 表达式方式构造线程方法
Thread thread1 = new Thread(()->System.out.println("Lambda表达式构建的线程,匿名内部类对象:" + Thread.currentThread().getName()) );
thread.start();
thread1.start();
System.out.println("main方法运行的线程:" + Thread.currentThread().getName());
/**
* 运行输出:
* Lambda表达式构建的线程,匿名内部类对象:Thread-1
* MyRunnableThreadThread-0
* main方法运行的线程:main
*/
}
}
 
 
 

java 多线程:Thread类;Runnable接口的更多相关文章

  1. 探Java多线程Thread类和Runnable接口之间的联系

    首先复习一下Java多线程实现机制,Java实现多线程方法有如下这么几种: 1.继承了(extends)Thread类 2.实现了(implements)Runnable接口 也就是说  有如下两种情 ...

  2. JAVA多线程Thread VS Runnable详解

    要求 必备知识 本文要求基本了解JAVA编程知识. 开发环境 windows 7/EditPlus 演示地址 源文件   进程与线程 进程是程序在处理机中的一次运行.一个进程既包括其所要执行的指令,也 ...

  3. Java多线程Thread类了解和使用

    创建线程的两种方式 extends Thread 类 public class WelComeApp { public static void main(String[] args) { Welcom ...

  4. java 多线程Thread和Runnable的区别

    如果一个类继承Thread,则不适合资源共享.但是如果实现了Runable接口的话,则很容易的实现资源共享 实现Runnable接口比继承Thread类所具有的优势:1. 适合多个相同的程序代码的线程 ...

  5. Java 多线程Thread和Runnable

    Thread: class MyThread extends Thread { private int ticketsCont=5; //一共有5张火车票 private String name; / ...

  6. Java多线程之实现Runnable接口

    package org.study2.javabase.ThreadsDemo.runnable; /** * @Auther:GongXingRui * @Date:2018/9/18 * @Des ...

  7. (CSDN迁移) JAVA多线程实现-实现Runnable接口

    实现Runnable接口  implements Runnable 重写run()方法 @Override public void run(){//TODO} 创建线程对象: Thread threa ...

  8. JAVA多线程Thread与Runnable

    一.Runnable Runnable为一个之包含一个run方法的接口 public class MyRunnable implements Runnable{ @Override //表示:预示重写 ...

  9. Java之多线程(实现Runnable接口)

    package test_demo.ThreadsDemo; public class TestRunnable { public static void main(String[] args) { ...

随机推荐

  1. Python的数据解析

  2. SpringBoot引入第三方jar的Bean的三种方式

    在SpringBoot的大环境下,基本上很少使用之前的xml配置Bean,主要是因为这种方式不好维护而且也不够方便. 因此本篇博文也不再介绍Spring中通过xml来声明bean的使用方式. 一.注解 ...

  3. 洛谷 P3643 - [APIO2016]划艇(dp)

    题面传送门 一道难度中等的 \(dp\)(虽然我没有想出来/kk). 首先一眼 \(dp_{i,j}\) 表示考虑到第 \(i\) 个学校,第 \(i\) 个学校派出了 \(j\) 个划艇的方案数,转 ...

  4. 【R】write.table输出数据带有行名?

    目录 问题 解决一 解决二 问题 这个问题应该很常见吧.R中输出数据框时,想要把行名和列名都输出.如果直接输出的话,输出的结果列名会往前移动一位,这显然不是我们想要的. 直接上例子: > a = ...

  5. 47-Generate Parentheses

    Generate Parentheses My Submissions QuestionEditorial Solution Total Accepted: 86957 Total Submissio ...

  6. 4.Reverse Words in a String-Leetcode

    class Solution { public: void reverseWords(string &s) { vector<string> data; string word; ...

  7. Git五个常见问题及解决方法

    一.删除远程仓库上被忽略的文件 由于种种原因,一些本应该被忽略的文件被我们误操作提交到了远程仓库了.那么我们该怎么删除这些文件呢? 以误提交了.idea目录为例,我们可以通过下面的步骤处理: 1)我们 ...

  8. Identity Server 4 从入门到落地(三)—— 创建Web客户端

    书接上回,我们已经搭建好了基于Identity Server 4的认证服务和管理应用(如果还没有搭建,参看本系列前两部分,相关代码可以从github下载:https://github.com/zhen ...

  9. 巩固javaweb的第二十八天

    巩固内容: 设置页面的编码方式 实现代码: 每个 JSP 页面都需要设置编码方式,设置 JSP 页面的编码方式可以是下面两种方式 之一. 方式一: <%@ page contentType=&q ...

  10. SQLite is 35% Faster Than The Filesystem

    比方说你要在C++/PHP里实现一个函数Image get_image(string id),不同的图片有1万张(用户头像),你可以把它们存在一个目录/文件夹里,然后fopen()再fread. 你也 ...