java基础之线程

maybecoding      2022-04-16     132

关键词:

进程与线程

  • 进程:进程是指内存中运行得一个程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程;进程是程序运行的一次过程,是系统运行程序的基本单位。

  • 线程:进程内部以个单独的独立执行单元,一个进程可以包含多个线程。

  • 进程与线程的区别:

    • 进程:有独立的存储空间,进程中的数据存放空间(栈空间和堆空间)是独立的,至少有一个线程

    • 线程:堆空间是共享的,栈空间是独立的,线程消耗的资源比进程小得多

  • 线程掉度

    • 计算机CPU在任意时刻只能执行一条指令,每一个进程只有获得CPU的使用权才能去执行指令。多进程并发执行,就是各个进程轮流抢夺CPU的使用权来完成指令。在可运行池中,会有多个线程处于就绪状态来等待抢夺CPU的使用权,JVM就负责了线程的调度。

    • JVM采用的是抢占式调度,没有使用分时调度,因为可能会造成多线程执行结果的随机性。

Java创建线程方法----继承Thread类

  • java中创建线程类使用的java.lang.Thread来创建线程,所有的线程都是Thread类或者其子类。

  • 通过继承Thread类来创建并启动线程的步骤如下:

    • 1.定义Thread类的子类,并重写run()方法,在run()中写好要执行的程序。

    • 2.创建Thread子类的实例对象,也即是创建了线程对象

    • 调用start()方法开启线程

    代码演示:

 1 //测试类
 2 public class Test1 {
 3     public static void main(String[] args) {
 4         MyThread001 thread001 = new MyThread001("我的线程");
 5         thread001.start();
 6         //主方法中循环执行打印语句
 7         for (int i = 1; i <=10 ; i++) {
 8             System.out.println("main线程第"+i+"次执行");
 9         }
10     }
11 }

 

 1 //实现类
 2 public class MyThread001 extends Thread{
 3     public MyThread001(String name) {
 4         super(name);
 5     }
 6 ?
 7     @Override
 8     public void run() {
 9         for (int i = 1; i <=5 ; i++) {
10             System.out.println(getName()+i+"正在执行");
11         }
12     }
13 }
14 ?

Thread类

  • Thread类常用构造方法

    • public Thread():分配一个新的线程对象。

    • public Thread(String name) :分配一个指定名字的新的线程对象。

    • public Thread(Runnable target) :分配一个带有指定目标新的线程对象

    • public Thread(Runnable target,String name) :分配一个带有指定目标新的线程对象并指定名字

  • Thread类常用方法

    • public String getName() :获取当前线程名称。

    • public void start() :导致此线程开始执行; Java虚拟机调用此线程的run方法。

    • public void run() :此线程要执行的任务在此处定义代码。

    • public static void sleep(long millis) :使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行)。

    • public static Thread currentThread() :返回对当前正在执行的线程对象的引用

Java创建线程方法-----实现Runnable接口

  • 通过实现Runnable接口来创建线程

    • 1.定义Runnable接口实现类,重写run()方法。

    • 2.创建实现类的示例,并将这个实例对象传给Thread。

    • 3.调用Start()方法,开启线程

1 //runnable子类
2 public class MyRunnable implements Runnable{
3     @Override
4     public void run() {
5         for (int i = 1; i <10 ; i++) {
6             System.out.println("第"+i+"遍执行Runnable接口的实例对象打印");
7         }
8     }
9 }
 1 //测试类
 2 public class Test2 {
 3     public static void main(String[] args) {
 4         //实例化runnable接口对象
 5         MyRunnable mr = new MyRunnable();
 6         //将runnable接口实例对象作为目标传入Thread中
 7         Thread thread = new Thread(mr,"runnable实例");
 8         //启动线程
 9         thread.start();
10         for (int i = 1; i <=5 ; i++) {
11             System.out.println("main线程第"+i+"次打印"+thread.getName());
12         }
13     }
14 }

 

除了这两种方式去创建一个线程,我i们也可以通过线程池来创建使用线程,这个以后再说

Thread和Runnable的区别

  • 如果一个类继承了Thread类,那么不适合做资源共享;如果实现了Runnable接口,则很容易实现资源共分享

  • Runnable和Thread都可以让多个相同程序代码去共享同一个资源

  • 增加程序的健壮性,实现解耦操作,代码可以被多个线程共享,代码与线程独立

     

java基础之多线程闭锁

1.闭锁方式1:利用CountDownLatch进行闭锁importjava.util.concurrent.CountDownLatch;publicclassCloseLock3{ publicstaticvoidmain(String[]args){ longstart=System.currentTimeMillis(); CountDownLatchlatch=newCountDow 查看详情

java基础之线程的交互

   voidnotify() 唤醒在此对象监视器上等待的单个线程   voidnotifyAll() 唤醒在此对象监视器上等待的所有线程   voidwait() 导致当前的线程等待,直到其他线程调用此对象的 notify()方法或... 查看详情

java基础之线程

进程与线程进程:进程是指内存中运行得一个程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程;进程是程序运行的一次过程,是系统运行程序的基本单位。线程:进程内部以个单独的独立执行单元... 查看详情

java多线程基础之任务调度

*Timer:任务调度 *schedule(TimerTasktask,Datetime); *schedule(TimerTasktask,Date *firstTime,longperiod); *TimerTask实现了Runnable接口;也是一个线程可以了解一下QUQRTZ框架 publicclassTime{ publicstaticv 查看详情

java并发编程系列之二线程基础

上篇文章对并发的理论基础进行了回顾,主要是为什么使用多线程、多线程会引发什么问题及引发的原因,和怎么使用Java中的多线程去解决这些问题。正所谓,知其然知其所以然,这是学习一个知识遵循的原则。推荐读者先行... 查看详情

java并发专题之二java线程基础

使用线程更好的提高资源利用率,但也会带来上下文切换的消耗,频繁的内核态和用户态的切换消耗,如果代码设计不好,可能弊大于利。一、线程  进程是分配资源的最小单位,线程是程序执行的最小单位;线程是依附于进... 查看详情

java基础学习——多线程之线程池

1.线程池介绍   线程池是一种线程使用模式。线程由于具有空闲(eg:等待返回值)和繁忙这种不同状态,当数量过多时其创建、销毁、调度等都会带来开销。线程池维护了多个线程,当分配可并发执行的任务时,它... 查看详情

java基础之(十四)--“多线程”

菜鸟里写的暂时够用了,菜鸟不充点:如果只想重写run()方法,而不重写其他Thread方法,那么应使用Runnable接口。这很重要,因为除非程序员打算修改或增强类的基本行为,否则不应为该类创建子类【java的api建议】菜鸟中只有前... 查看详情

java基础学习——多线程之创建任务

  这次来盘点一下Java中用线程执行任务的写法。1.扩展Thread  最基本的实现方法是在创建一个继承Thread的新类,在其中覆盖run()方法执行任务。1publicclassMyThreadextendsThread{2//变量3privateStringname="";4//构造函数5publicMyThrea... 查看详情

java基础之线程阻塞队列

   阻塞队列是Java线程新特征中的内容,Java定义了阻塞队列的接口java.util.concurrent.BlockingQueue,阻塞队列的概念是,一个指定长度的队列,如果队列满了,添加新元素的操作会被阻塞等待,直到有空位为止。同样,当队... 查看详情

java基础之线程

一、线程的基本概念  程序(program)是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。  进程(process)是程序的一次执行过程,或是正在运行的一个程序。动态过程:有它自身的产生、存... 查看详情

java基础之线程原子量

   所谓的原子量即操作变量的操作是“原子的”,该操作不可再分,因此是线程安全的。为何要使用原子变量呢,原因是多个线程对单个变量操作也会引起一些问题。在Java5之前,可以通过volatile、synchronized关键... 查看详情

java多线程系列---“基础篇”07之线程休眠

转自:http://www.cnblogs.com/skywang12345/p/3479256.html  (含部分修改)概要本章,会对Thread中sleep()方法进行介绍。涉及到的内容包括: sleep()介绍 sleep()示例 sleep()与wait()的比较一.sleep()介绍sleep()定义在Thread.java中。slee 查看详情

java多线程系列---“基础篇”06之线程让步

转自:http://www.cnblogs.com/skywang12345/p/3479243.html  (含部分修改)概要本章,会对Thread中的线程让步方法yield()进行介绍。涉及到的内容包括:yield()介绍yield()示例yield()与wait()的比较  一.yield()介绍yield()的作用是让步。... 查看详情

java基础之线程的两种实现方式

  进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程!线程总是属于某个线程,进程中的线程共享进程的内存   注意:对Java来说,run()方法没有任何特... 查看详情

java基础之线程阻塞栈

   阻塞栈,与阻塞队列相似。不同点在于栈是“后入先出”的结构,每次操作的是栈顶,而队列是“先进先出”的结构,每次操作的是队列头;Java为阻塞栈定义了接口:java.util.concurrent.BlockingDeque,其实现... 查看详情

java基础之线程新特性条件变量

   条件变量都实现了java.util.concurrent.locks.Condition接口,条件变量的实例化是通过一个Lock对象上调用newCondition()方法来获取的,这样,条件就和一个锁对象绑定起来了。因此,Java中的条件变量只能和锁配合使用,来控... 查看详情

java基础之线程9-cpuvolatile

cpuvolatile和上一篇javavolatile不一样。cpu是如何保证各内存之间数据可见性的呢?答:缓存一致性协议(MESIcache)。           cacheline:cpu缓存行,多大呢64b字节  查看详情