关于多进程与多线程

使用多进程的目的:提高CPU利用率。

使用多线程的目的:提高应用程序?利用率。

多线程与多进程区别:进程间内存独立;同一个进程的线程间共享“堆内存和方法区内存”,栈内存是独立的,一个线程一个栈。

JVM原理

  • Java命令启动JVM虚拟机,等于启动了一个进程,该进程会自动启动一个主线程,然后主线程去调用某个类的main方法,所以main方法执行在主线程中。
  • 单线程中,一个方法调用另一个方法,则这些方法按序压入栈中,此时JVM中只有一个栈。

线程的创建和启动

方法一:继承Thread类

public class ThreadTest {
public static void main() {
//创建一个线程
Thread t=new Processer();
//启动一个线程
t.start();//这段代码执行瞬间结束。只是告诉JVM再分配一个栈给t线程。
//run方法不需要程序员手动调用,系统线程启动后自动调用run方法。 //t.run();//若不写t.start(),直接t.run(),将还是有一个线程,t中的方法也在主线程中执行。 //有了多线程后,main方法结束只是说明主线程栈中没有方法栈帧了。
//但是其他线程(栈)中可能还有栈帧。
//所以main方法结束,程序可能还在运行。
}
}
//定义一个线程
public class Processor extends Thread {
//重写run方法
public void run() {
System.out.println("hello");
}
}

方法二:实现Runnable接口(推荐,因为一个类实现接口的同时可以保留类的继承)

public class ThreadTest {
public static void main(String args[]) {
//创建一个线程
Thread t=new Thread(new Processer());
t.start();
}
}
//定义一个线程
public class Processer implements Runnable {
//重写run方法
public void run() {
System.out.println("hello");
}
}

线程的生命周期

线程的调度与控制

Java虚拟机负责线程的调度,Java使用抢占式调度模型:优先级高的线程获取的CPU时间片相对多一些。此外,线程调度模型还有分时调度模型,所有线程轮流获得CPU时间片,CPU时间片在线程间是平均分配的。

API:获取当前线程对象、给当前线程起名、获取当前线程名称

Thread t=Thread.currentThread();//获取当前线程对象
t.setName("threadA");//给当前线程起名
t.getName();//获取当前线程名

优先级

优先级:最低 1-10 最高,默认为5。

t.setPriority(4);//设置线程优先级

阻塞线程(sleep方法)

Thread.sleep(5000);

  1. 注意这是一个静态方法,作用是阻塞当前线程,阻塞结束才能继续进入就绪态。由以下,t.sleep(5000)与线程t无关,作用是阻塞当前线程

静态方法用类名调用,当用对象调用时,在运行阶段仍是类调用,与具体对象无关。

  1. 参数单位是毫秒
  2. sleep抛出InterruptedException,必须要在调用的地方处理异常。由以下有原因,若是在继承了Thread的类的重写的run方法中调用sleep方法,则只能采用try catch来处理异常;在main方法中则可以直接throw。

覆盖的方法不能比被覆盖的方法抛出更宽泛的异常。

中断线程的休眠:依靠异常处理机制,(InterruptedEcception)

t.interrupt();

终止线程较好的方法:

在线程中设置bool变量,线程中判该变量为true才继续执行。故可在调用线程的地方更改线程的该bool变量以终止线程。

yield方法

Thread.yield()

  • 作用:给其他同优先级的线程让位,但让位时间不固定。
  • 该方法是一个静态方法。

合并线程 join

  • t.join()t线程和当前线程合并,两个栈合并为一个栈。
  • join是成员方法;join有异常抛出。

线程同步

异步编程模型与同步编程模型

异步编程模型:线程各自执行各自的,不需要等待对方处理完什么。

同步编程模型:由于线程间的共享数据需要修改操作,为保证数据安全,使得一个线程执行完,另一个线程才能执行。

两个线程共享数据方法

通过构造函数传参,参数为共享的对象(的内存地址)。

实现线程同步方法

1. synchronized关键字直接作用在要同步的语句块(使用对象锁)

把要同步的代码,放到同步语句块中。

synchronized(同步的对象){//同步语句块
要同步的代码
}
2. 用synchronized关键字修饰成员方法,表示this对象作为同步对象,整个成员方法都需要同步。(使用对象锁)

原理:

线程执行遇到synchronized关键字,就会去看同步的对象的对象锁(0/1),若能拿到对象锁,就可以执行同步语句块,否则等待,直到能拿到对象锁。

注意,锁是加在对象上的。

3. synchronized加在静态方法上(使用类锁)

synchronized加在静态方法上,线程执行此方法时会找类锁(一个类只有一把类锁)。

死锁(会写代码举例子)

例子:

两个线程共享两个对象,各自分别占有一个对象的锁,等待另一个对象的锁,造成死锁。

线程中synchronized一个对象,再synchronized一个对象。

守护线程

  • 其他所有用户线程结束,则守护线程结束。
  • 守护线程一般都是无限执行的。
  • t1.setDaemon(true);将线程设置为守护线程。
  • jvm进程启动时,启动主线程和垃圾回收器,垃圾回收器就是一个守护线程。

定时器

每隔一段固定时间执行一段代码。

Timer t=new Timer();//创建定时器
t.schedule(TimerTask task,Date firstTime,long period);//启动定时任务,此处给的声明,具体改成对应参数。

[Java学习]多线程的更多相关文章

  1. Java学习多线程第一天

    内容介绍 Thread 线程创建 线程池 线程状态图 1 多线程 1.1     多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序 ...

  2. Java学习---多线程的学习

    基础知识 每个正在系统上运行的程序都是一个进程(process).每个进程包含一到多个线程(thread).进程也可能是整个程序或者是部分程序的动态执行. 线程是一组指令的集合,或者是程序的特殊段,它 ...

  3. java学习多线程之生产者消费者

    在java多线程当中还有一种关系需要我们来重点掌握,那就是生产者和消费者的关系.那么什么是生产者,什么是消费者呢?我们可以举个例子来说,有张三.李四负责生产烤鸭,王五.马六负责吃烤鸭,那么前者生产完烤 ...

  4. java学习多线程之卖票示例

    这一节我们来说一个示例就是卖票示例: 需求: 我们现在有100张票,然后分四个窗口来卖,直到卖完为止. 思路: 1.先定一个一个票类,描述票的属性,还有打印卖出的票,并且实现Runnable中的run ...

  5. java学习多线程之创建多线程一

    现在我们有这么一个需求,就是在主线程在运行的同时,我们想做其他的任务,这个时候我们就用到了多线程.那么如何创建多线程,我们知道在系统当中qq的多线程创建是由操作系统来完成的,那么如果我们想在java当 ...

  6. java学习——多线程

    本文内容来源于  历经5年锤练--史上最适合初学者入门的Java基础视频 线程:就是进程中一个负责程序执行的控制单元(执行路径) 每一个线程都有自己运行的内容.这个内容可以称为线程要执行的任务. 多线 ...

  7. Java学习多线程第二天

    内容介绍 线程安全 线程同步 死锁 Lock锁 等待唤醒机制 1    多线程 1.1     线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果 ...

  8. Java学习|多线程学习笔记

    什么是线程?     可以理解为进程中独立运行的字任务.   使用多线程:     1.继承Thread类:从源码可以看到,Thread累实现了Runnable接口.         如果多次调用st ...

  9. java学习多线程之死锁

    形成死锁的前提是同步代码块嵌套. 什么是死锁?当一个线程拿到锁以后在这个锁内部的代码需要访问另一段的代码的时候另外一个程序的锁被另外一个线程拿到,这样的话,就造成了两个锁互不想让程序没法往下执行的这种 ...

随机推荐

  1. 第十四章 Java常用类

    14.常用类 14.1 字符串相关的类 1课时 14.2 JDK 8之前时间日期API 1课时 14.3 JDK8中新时间日期API 1课时 14.4 JDK8中的Optional类 1课时 14.5 ...

  2. 1.2.3 Excel中姓名处理,将名加密星号

    在对应的单元格中我们输入公式: =IF(LEN(A22)>2,REPLACE(A22,2,LEN(A22)-1,"**"),REPLACE(A22,2,LEN(A22)-1, ...

  3. Excel技巧--实现交叉查询

    如上图,要实现某个地区和某个产品的销售额查询显示.可以使用Match和Index函数的使用来实现: 1.产品名称和城市栏,制作成列表可选:使用“数据”-->“数据验证”的方法. 2.先在旁边空位 ...

  4. 【python】self & cls

    转自 python中self,cls 普通的方法,第一个参数需要是self,它表示一个具体的实例本身. 如果用了staticmethod,那么就可以无视这个self,而将这个方法当成一个普通的函数使用 ...

  5. java File处理

    /**************************************************************************************工具类********** ...

  6. STS启动时卡在loading加载 dashboard.ui

    如果你在用STS 3.4或3.5,启动时可能会卡在 解决方法:打开STS安装目录下的plugins目录,删除文件 org.springsource.ide.eclipse.dashboard.ui_3 ...

  7. excel 设置的函数在打开的时候不会自动执行

    excel中设置了个today的函数,显示今天的日期,结果不执行. 解决方案:打开该excel,选择File-->Options  ,在弹出的框框中选择Formulas,在主界面的Calcula ...

  8. CSS之checkbox&radio&textarea&select

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. ARM 编译产生.map之RO RW ZI

    RO:  程序中的指令和常量,存储在常量和代码区,因为是不能改变的,所以—READ ONLY; RW: 程序中的已初始化全局变量和静态变量,存储在堆中,因为是变量,所以——READ AND WRITE ...

  10. jdbc链接数据库的url两种写法

    首先看下面两个jdbc的url 一:jdbc.url=jdbc:oracle:thin:@100.2.194.200:1521/abc二:jdbc.url=jdbc:oracle:thin:@100. ...