java学习第22天(关于进程的创建及使用)

多线程其实在操作系统已经深入了解过,现在就不做学习概念,其实理解线程很简单,首先进程就是一种正在内核态运行的软件,而线程就是一种轻量化的进程,和进程不同的是线程一般存在于一个进程中,共享地址空间。具体的可以参考操作系统的课程。

那么java程序的运行原理及JVM的启动是多线程的吗?
A:Java命令去启动JVM,JVM会启动一个进程,该进程会启动一个主线程。
B:JVM的启动是多线程的,因为它最低有两个线程启动了,主线程和垃圾回收线程。

多线程的实现由三种方法

第一种

继承Thread类并重写run方法

public Class A extends Thread{

@Override

public void run(){

}

}

注意使用的时候,我们不直接调用run方法,而是使用start启动线程。

A a=new A();

a.start //不是a.run

介绍几个线程中的方法,首先是获取名字:getName()//获取当前进程的名字。更改名字的方法 A a=new A(“thread_1”)

那么思考一个问题如果是其他的线程我们想获取名字但是并没有调用Thread类,比如我想要查看主线程的方法,使用getName,它会报错,因为主函数并不是Thread,此时有一个方法是,Thread currentThread() 方法可以返回一个Thread类型的参数,所以我们可以Thread currentThread().getName()。还有一个方法是优先级,关于调度的知识在操作系统和机组中都有说明。getPriority()获取当前线程的优先级。setPriority()设定优先级(最高为10,最低为1)。join(),它的作用是让某个线程执行完毕再

去执行其它线程。中断线程 interrupt(),它可以使线程中断,并返回一个InterruptedExpection类型,则收到这个错误之后,在类中的try catch中,catch收到错误,执行里面的内容,然后继续执行,这样的好处是代码可以通过走try catch,而继续执行下去。还有很多类似守护线程和礼让线程,可以自行看API了解。

第二种方式

实现Runnable接口

public Class A implements Runable{

@Override

public void run(){

}

}

A a=new A();

//有点和第一类不一样了,需要创建Thread类的对象,并把上面类的对象作为参数传递。

Thread t1=new Thread(a,“Thread_1”);

t1.start();

那么我们先把这两种方法比较,为什么需要两种方法?原因是这样的,因为java是单继承的,也就是说,如果我的一个类有了父类或者以后可能需要继承那么我们就使用第二种方法。

需要注意的是如同在操作系统中学习的互斥区的概念,如果run中的代码对同步性有着很大的要求,举个例子:while(tickets>0){

System.out.println(Thread.currentThread.getName()+"正在出售第 "+tickets--);

}

在多线程中这样的代码是不安全的,比如恰好我有三个进程同时进入while中,假设此时tickets都是1,那么此时会出现问题,第一个进程执行完了后,tickets变成0,但其他两个进程还在while中,所以还会继续执行,tickets变成-1.-2.那么我们应该怎么解决呢,这里的思想和互斥区的思想是一样的,我们使这段代码只允许一个进程进入,那么就可以解决问题了。使java提供的就是synchronized(),具体怎么使用呢?简单的说就是我们将需要同一时刻只允许执行一个进程的一段代码包起来。注意此时物品我们需要在代码外面建立一个对象作为共享对像。然后加入到这个方法中。举个例子:

Object ob=new Object();

synchronized(obj){

while(tickets>0){

System.out.println(Thread.currentThread.getName()+"正在出售第 "+tickets--);

}

}

时间: 2024-08-25 17:05:33

java学习第22天(关于进程的创建及使用)的相关文章

Java学习笔记22

Java集合类是一种特别有用的工具类,可以用于存储数量不等的多个对象,并可以实现常用的数据结构,如:栈. 队列等.除此之外,Java集合类还可用于保存具有映射关系的关联数组.Java集合大致可分为Set.List和Map三种 状态,其中Set代表无序.不可重复的集合:List代表有序.重复的集合:而Map代表具有映射关系的集合. Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口又 包含了一些子接口或实现类.

java学习第22天(关于java中的锁LOCK及多线程的面试题)

在JDK5后,java提供一种更加方便的安全机制,不使用synchronized,针对线程的锁定操作和释放操作使用Lock锁.更加清晰明了.举例: Lock lock=new ReentrantLock(); lock.lock 需要加锁的代码 lock.unlock  为什么说lock更为安全呢?因为synchronized可能会造成死锁现象,具体关于死锁现象可以参考操作系统,就不再多说. 总结下在线程中的主要几个问题 首先是 多线程有几种实现方式 应该上是有三种,第一种继承Thread类,第

我的java学习笔记(22)关于在框架中显式信息

1.JFrame的结构相当复杂,有四层面板.其中Swing程序员最关心的是内容窗格. 2.绘制一个组件,需要定义一个扩展JComponent的类,并覆盖其中的paintComponent方法. class Exp extends JComponent { public void paintComponent(Graphics g) { ... } } 3.paintComponent方法有一个Graghics类型的参数,这个参数保存着用于绘制图像和文本的设置. 4.在java中,所有绘制都必须使

Java并发编程:线程、进程的创建

首先要理清下进程.线程和应用程序概念. 从一定意义上讲,进程就是一个应用程序在处理机上的一次执行过程,它是一个动态的概念,而线程是进程中的一部分,进程包含多个线程在运行. a. 进程是一个具有独立功能的程序关于某个数据集合的一次运行活动.它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体.它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示. b. 进程是一个"执行中的程序".程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的

Java学习小结(1)-数组的创建与传参

(一)数组的创建 数组的创建包括两部分:数组的申明与分配内存空间. int score[]=null; //申明一维数组 score=new int[3]; //分配长度为3的空间 数组的申明还有另外一种方式: int[] score=null; //把中括号写在数组名前面 通常,在写代码时,为了方便,我们将两行合并为一行: int score[]=new int score[3]; //将数组申明与分配内存写在一行 (二)传递参数 由于初学java,这里只讨论值传递,不考虑地址传递.主要有3点

Java学习笔记——线程两种常用的创建调用方法

这是两种开发中常用的线程使用方法,匿名对象调用即可,很简单,掌握即可 <span style="font-size:18px;">class ThreadDemo { public static void main(String[] args) { new Thread() { public void run() { //coding here } }.start(); Runnable r = new Runnable() { public void run() { //

Java学习笔记4

1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Runtime Environment,Java运行环境),运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库. ③.JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的.

Java学习第5天

---恢复内容开始--- 今天是2016年5月4号,今天是学习JAVA学习的第5天!今天的主要学习任务是对二维数组的学习. P96 3.7.5 二维数组 动态初始化 数据类型 数组名称 [][]=new 数据类型[行数][列数]   ; 如,int a[][]=new int[7][8]; 静态初始化 数据类型 数组名称 [][]=new 数据类型 [][]{ {值,值,...},{值,值,...},...}; 如,int a[][]=new int[][]{ {1,2,3},{54,6},{8

Java学习-008-判断文件类型实例

此文源码主要为应用 Java 如何判断文件类型的源码及其测试源码.若有不足之处,敬请大神指正,不胜感激!源代码测试通过日期为:2015-2-2 23:02:00,请知悉. Java 判断文件类型源码如下所示: 1 /** 2 * @function 判断文件类型 3 * 4 * @author Aaron.ffp 5 * @version V1.0.0: autoUISelenium main.java.aaron.java.tools FileUtils.java assertFileType