本文关键词:
java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁  sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中

多线程

•进程:
•正在运行的程序,是系统进行资源分配和调用的独立单位。
•每一个进程都有它自己的内存空间和系统资源。
•线程:
•是进程中的单个顺序控制流,是一条执行路径
•一个进程如果只有一条执行路径,则称为单线程程序。
•一个进程如果有多条执行路径,则称为多线程程序。
 
                多进程的意义?
                        提高CPU的使用率
                多线程的意义?
                        提高应用程序的使用率
 

Java程序运行原理

•java命令会启动 java 虚拟机,启动 JVM,等于启动了一个应用程序,也就是启动了一个进程。
该进程会自动启动一个 “主线程” ,然后主线程去调用某个类的 main方法。
所以 main方法运行在主线程中。在此之前的所有程序都是单线程的。
 
java中对于线程的描述是Thread  其中封装了线程的信息,最重要的还有需要执行的任务的信息
Thread类名的基本获取和设置方法
•public final String getName()
•public final void setName(String name)
•其实通过构造方法也可以给线程起名字
 
 

创建线程方式一

继承Thread类

1.子类覆盖父类中的run方法,将线程运行的代码存放在run中。
2.建立子类对象的同时线程也被创建。
3.通过调用start方法开启线程。
 
 

创建线程方式二

实现Runnable接口

1.子类覆盖接口中的run方法。
2.通过Thread类创建线程,并将实现了Runnable接口的子类对象作为参数传递给Thread类的构造函数。
3.Thread类对象调用start方法开启线程。
 
启动一个线程是run()还是start()?它们的区别?
        start();
 
        run():封装了被线程执行的代码,直接调用仅仅是普通方法的调用
        start():启动线程,并由JVM自动调用run()方法
 
 

线程的调度和优先级

        线程的调度
                分时调度
                抢占式调度 (Java采用的是该调度方式)
        获取和设置线程优先级
                默认是5
                范围是1-10
 
 

线程的控制方法

•线程休眠
•public static void sleep(long millis)
•线程加入
•public final void join()
•线程礼让
•public static void yield()
•后台线程
•public final void setDaemon(boolean on)
•中断线程
•public final void stop()  过时
•public void interrupt()
 
停止线程还可以通过定义循环控制标志来解决现成的停止问题

sleep()和wait()方法的区别

        sleep():必须指时间;不释放锁。
        wait():可以不指定时间,也可以指定时间;释放锁。
 
为什么wait(),notify(),notifyAll()等方法都定义在Object类中
        因为这些方法的调用是依赖于锁对象的,而同步代码块的锁对象是任意锁。
        而Object代码任意的对象,所以,定义在这里面。
 
 
多线程同时请求共享资源,并且操作的代码不是原子操作的时候
就会出现多线程的安全问题
 

解决线程安全问题的基本思想

首先想为什么出现问题?(也是我们判断是否有问题的标准)
•是否是多线程环境
•是否有共享数据
•是否有多条语句操作共享数据
如何解决多线程安全问题呢?
•基本思想:让程序没有安全问题的环境。
•怎么实现呢?
•把多个语句操作共享数据的代码给锁起来,让任意时刻只能有一个线程执行即可。
 

同步

同步代码块
•格式:

      synchronized(对象){需要同步的代码;}

•同步可以解决安全问题的根本原因就在那个对象上。该对象如同锁的功能。
同步方法
•就是把同步关键字加到方法上
同步方法的锁对象是this
静态同步方法所对象是类名.class 对象
 
Lock
Lock
•void lock()
•void unlock()
ReentrantLock
 
 

线程组

Java中使用ThreadGroup来表示线程组,它可以对一批线程进行分类管理,Java允许程序直接对线程组进行控制。
•默认情况下,所有的线程都属于主线程组。
•public final ThreadGroup getThreadGroup()
•我们也可以给线程设置分组
•Thread(ThreadGroup group, Runnable target, String name)
 
 

线程池

程序启动一个新线程成本是比较高的,因为它涉及到要与操作系统进行交互。
而使用线程池可以很好的提高性能
尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使用线程池。
•线程池里的每一个线程代码结束后,并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用。
•在JDK5之前,我们必须手动实现自己的线程池,从JDK5开始,Java内置支持线程池
 
JDK5新增了一个Executors工厂类来产生线程池,有如下几个方法
•public static ExecutorService newCachedThreadPool()
•public static ExecutorService newFixedThreadPool(int nThreads)
•public static ExecutorService newSingleThreadExecutor()
•这些方法的返回值是ExecutorService对象,
该对象表示一个线程池,可以执行Runnable对象或者Callable对象代表的线程。它提供了如下方法
•Future<?> submit(Runnable task)
•<T> Future<T> submit(Callable<T> task)
 
实现Callable接口  也可以实现多线程
 

匿名内部类方式使用多线程

new Thread(){代码…}.start();
New Thread(new Runnable(){代码…}).start();
 
 

定时器

定时器是一个应用十分广泛的线程工具,可用于调度多个定时任务以后台线程的方式执行。
在Java中,可以通过Timer和TimerTask类来实现定义调度的功能
Timer
•public Timer()
•public void schedule(TimerTask task, long delay)
•public void schedule(TimerTask task,long delay,long period)
TimerTask
•public abstract void run()
•public boolean cancel()
开发中
Quartz是一个完全由java编写的开源调度框架。
 
 

线程类的其他方法

setPriority(int num)
setDaemon(boolean b)
join()
自定义线程名称
toString()
 
 

-1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中的更多相关文章

  1. wait(),notify(),notifyAll()用来操作线程为什么定义在Object类中?

    这些方法存在于同步中: 使用这些方法必须标识同步所属的锁: 锁可以是任意对象,所以任意对象调用方法一定定义在Object类中. Condition是在java 1.5中才出现的,它用来替代传统的Obj ...

  2. Object类中常见的方法,为什么wait notify会放在Object里边

    toString():输出一个对象的地址字符串(哈希code码):可以通过重写toString方法,获取对象的属性! equals():比较的是对象的引用是否指向同一块内存地址, 重写equals() ...

  3. 一、基础篇--1.1Java基础-Object类中常见的方法,为什么wait notify会放在Object里边

    这是个设计相关的问题,它考察的是面试者对现有系统和一些普遍存在但看起来不合理的事物的看法.回答这些问题的时候,你要说明为什么把这些方法放在Object类里是有意义的,还有不把它放在Thread类里的原 ...

  4. Java面试系列第2篇-Object类中的方法

    Java的Object是所有引用类型的父类,定义的方法按照用途可以分为以下几种: (1)构造函数 (2)hashCode() 和 equals() 函数用来判断对象是否相同 (3)wait().wai ...

  5. Object类中wait代餐方法和notifyAll方法和线程间通信

    Object类中wait代餐方法和notifyAll方法 package com.yang.Test.ThreadStudy; import lombok.SneakyThrows; /** * 进入 ...

  6. wait(), notify(), notifyAll()等方法介绍

    在Object.java中,定义了wait(), notify()和notifyAll()等接口.wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁.而not ...

  7. Java多线程干货系列—(一)Java多线程基础

    前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程:进程中负责程序执行的 ...

  8. [转]Java多线程干货系列—(一)Java多线程基础

    Java多线程干货系列—(一)Java多线程基础 字数7618 阅读1875 评论21 喜欢86 前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们 ...

  9. 【Java基础之Object类(一)】Java中Object类中的所有方法(toString、equals、hashCode、clone、finalize、wait和notify等)详解(转载)

    java中的hashcode.equals和toString方法都是基类Object的方法. 首先说说toString方法,简单的总结了下API说明就是:返回该对象的字符串表示,信息应该是简明但易于读 ...

随机推荐

  1. hive求TopN语句

    ROW_NUMBER,RANK(),DENSE_RANK() 先了解这三个之间的区别: Rank():1,2,2,4,5(一般用这个较多,不会影响总排名) Dense_rank():1,2,2,3,4 ...

  2. go、java or c艹 引用的本质

    在底层,引用变量由指针按照指针常量的方式实现 即一个指针常量,和一些解引用等的封装: 合到一起实现了指针这么一种形式. 用指针和引用编译到了汇编层面应该是一样的.

  3. php操作数组函数

    整理了一份PHP开发中数组操作大全,包含有数组操作的基本函数.数组的分段和填充.数组与栈.数组与列队.回调函数.排序.计算.其他的数组函数等. 一.数组操作的基本函数 数组的键名和值 array_va ...

  4. 显存充足,但是却出现CUDA error:out of memory错误

    之前一开始以为是cuda和cudnn安装错误导致的,所以重装了,但是后来发现重装也出错了. 后来重装后的用了一会也出现了问题.确定其实是Tensorflow和pytorch冲突导致的,因为我发现当我同 ...

  5. 32、可以拿来用的JavaScript实用功能代码

    可以拿来用的JavaScript实用功能代码(可能会有些bug,用时稍微修改下,我用了几个还可以) 转载自 1.原生JavaScript实现字符串长度截取 function cutstr(str, l ...

  6. Oracle 函数 Function

    定义 函数用于计算和返回一个结果值,把经常需要进行的计算写成函数,函数的调用是表达式的一部分.     函数与过程在创建的形式上有些相似,也是编译后放在内存中供用户使用.     函数必须有一个返回值 ...

  7. Mybatis Mapper文件中的一小坑

    前几天来一需求,实现过程中需要修改一个底层的查询接口,具体修改就是在where中添加一个条件,由于这个底层SQL使用的地方太多,所以就想着是用if加一标识符做个判断,传一个只有我会使用的参数,然后动态 ...

  8. OJ002

    register:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率.注意是尽可能,不是绝对. 因为,如果定义了很多register变量,可能会超过CPU的寄 ...

  9. python语法_装饰器

    装饰器的知识点储备: 1 作用域 2 高阶函数 3 闭包 内部函数,对外部作用作用域的变量进行了引用,该内部函数就认为是闭包, def outer(): x=10 def inner(): print ...

  10. 【RL-TCPnet网络教程】第24章 RL-TCPnet之网络控制报文协议ICMP

    第24章     RL-TCPnet之网络控制报文协议ICMP 本章节为大家讲解ICMP(Internet Control Message Protocol,网络控制报文协议),通过前面章节对TCP和 ...