java线程总结(1/5)
前言
闲来无事正值面试,看面试中有线程之问题,特此总结一番。
正文
一.线程和进程的区别:
1.每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销。
2.线程可以看成时轻量级的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小。
3.线程和进程最根本的区别在于:进程作为资源分配的单位,线程是调度和执行的单位。
二.多进程: 在操作系统中能同时运行多个任务(程序)。
三.多线程: 在同一应用程序中有多个顺序流同时执行。
四.概念:
1.线程是进程的一部分,所以线程有的时候被称为是轻权进程或者轻量级进程。
2.一个没有线程的进程是可以被看作单线程的,如果一个进程内拥有多个进程,进程的执行过程不是一条线(线程)的,而是多条线(线程)共同完成的。
3.系统在运行的时候会为每个进程分配不同的内存区域,但是不会为线程分配内存(线程所使用的资源是它所属的进程的资源),线程组只能共享资源。那就是 说,出了CPU之外(线程在运行的时候要占用CPU资源),计算机内部的软硬件资源的分配与线程无关,线程只能共享它所属进程的资源。
五.进程与程序的区别:
1.程序是一组指令的集合,它是静态的实体,没有执行的含义。而进程是一个动态的实体,有自己的生命周期。
2.一般说来,一个进程肯定与一个程序相对应,并且只有一个,但是一个程序可以有多个进程,或者一个进程都没有。
3.除此之外,进程还有并发性和交往性。简单地说,进程是程序的一部分,程序运行的时候会产生进程。
六.JAVA中如何实现多线程:
1.通过继承Thread类实现多线程:
a.在Java中负责线程的这个功能的是Java.lang.Thread 这个类
b.可以通过创建Thread 的实例来创建新的线程。
c.每个线程都是通过某个特定Thread对象所对应的方法run( )来完成其操作的,方法run( )称为线程体。
d.通过调用Thead类的start()方法来启动一个线程。
这种方式的缺点:那就是如果我们的类已经从一个类继承(如小程序必须继承自 Applet 类),则无法再继承Thread 类。
package com.horizon.action; public class TestThread extends Thread { public void run() {
for (int i = ; i < ; i++) {
System.out.println(this.getName() + ":" + i);
}
} public static void main(String[] args) {
TestThread t1 = new TestThread();
t1.start();
TestThread t2 = new TestThread();
t2.start();
} }
2.通过Runnable接口实现多线程:
优点:可以同时实现继承。实现Runnable接口方式要通用一些。
package com.horizon.action; public class TestThread2 implements Runnable { int threadId; public TestThread2(int id) {
super();
this.threadId = id;
} public static void main(String[] args) {
Thread thread1 = new Thread(new TestThread2());
thread1.start();
Thread thread2 = new Thread(new TestThread2());
thread2.start();
} public void run() {
for (int i = ; i < ; i++) {
System.out.println(this.threadId + ":" + i);
}
}
}
七.线程状态和sleep/yield/join/stop/destroy方法()
新生状态:
用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态。处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态(runnable)。
就绪状态(runnable):
处于就绪状态的线程已经具备了运行条件,但还没有分配到CPU,处于线程就绪队列,等待系统为其分配CPU。等待状态并不是执行状态,当系统选定一个等待执行的Thread对象后,它就会从等待执行状态进入执行状态,系统挑选的动作称之为“cpu调度”。一旦获得CPU,线程就进入运行状态并自动调用自己的run方法。
运行状态:
在运行状态的线程执行自己的run方法中代码,直到调用其他方法而终止、或等待某资源而阻塞或完成任务而死亡。如果在给定的时间片内没有执行结束,就会被系统给换下来回到等待执行状态。
死亡状态:
死亡状态是线程生命周期中的最后一个阶段。
线程死亡的原因有两个:一个是正常运行的线程完成了它的全部工作;另一个是线程被强制性地终止,如(通过执行stop或destroy方法来终止一个线程{不推荐使用这两个方法。前者会产生异常,后者是强制终止,不会释放锁,另外程序报错也会导致锁的释放})
Method stop() & destroy() in the class Thread is deprecated。
当一个线程进入死亡状态以后,就不能再回到其它状态了。 让一个Thread对象重新执行一次的唯一方法,就是重新产生一个Thread对象。
A.终止线程的典型方法(重要):
package com.horizon.action; public class TestThreadCiycle implements Runnable { String name;
boolean live = true; public TestThreadCiycle(String name) {
super();
this.name = name;
} public void run() {
int i = ;
while (live) {
System.out.println(name + (i++));
}
} public void terminate() {
live = false;
} public static void main(String[] args) {
TestThreadCiycle ttc = new TestThreadCiycle("线程A:");
Thread t1 = new Thread(ttc); // 新生状态
t1.start(); // 就绪状态
for (int i = ; i < ; i++) {
System.out.println(i);
}
ttc.terminate();
System.out.println("ttc stop!");
} }
阻塞状态:
处于运行状态的线程在某些情况下,如执行了sleep(睡眠)方法,或等待I/O设备等资源,将让出CPU并暂时停止自己的运行,进入阻塞状态。
1. 在阻塞状态的线程不能进入就绪队列。只有当引起阻塞的原因消除时,如睡眠时间已到,或等待的I/O设备空闲下来,线程便转入就绪状态,重新到就绪队列中排队等待,被系统选中后从原来停止的位置开始继续运行。
有三种方法可以暂停Threads执行:
1. sleep方法:Sleep时别的线程也不可以访问锁定对象。
2. yield方法: 让出CPU的使用权,从运行态直接进入就绪态。让CPU重新挑选哪一个线程进入运行状态。
3. join方法: 当某个线程等待另一个线程执行结束后,才继续执行时,使用join方法。使调用该方法的线程在此之前执行完毕,也就是等待调用该方法的线程执行完毕后再往下继续执行。
package com.horizon.action; public class TestThreadState { public static void main(String[] args) {
// 使用继承方式实现多线程
// StateThread thread1 = new StateThread();
// thread1.start();
// StateThread thread2 = new StateThread();
// thread2.start(); System.out.println("爸爸和儿子买烟故事"); Thread father = new Thread(new FatherThread());
father.start();
} } class StateThread extends Thread {
public void run() {
for (int i = ; i < ; i++) {
System.out.println(this.getName() + ":" + i);
try {
Thread.sleep();
} catch (InterruptedException e) {
e.printStackTrace();
}
Thread.yield();
}
}
} class FatherThread implements Runnable {
public void run() {
System.out.println("爸爸想抽烟,发现烟抽完了");
System.out.println("爸爸让儿子去买包红塔山");
Thread son = new Thread(new SonThread());
son.start();
System.out.println("爸爸等儿子买烟回来");
try {
son.join();
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("爸爸出门去找儿子跑哪去了");
System.exit();// 结束JVM。如果是0则表示正常结束;如果是非0则表示非正常结束
}
System.out.println("爸爸高兴的接过烟开始抽,并把零钱给了儿子");
}
} class SonThread implements Runnable {
public void run() {
System.out.println("儿子出门去买烟");
System.out.println("儿子买烟需要10分钟");
try {
for (int i = ; i <= ; i++) {
System.out.println("第" + i + "分钟");
Thread.sleep();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("儿子买烟回来了");
}
}
java线程总结(1/5)的更多相关文章
- Java线程并发:知识点
Java线程并发:知识点 发布:一个对象是使它能够被当前范围之外的代码所引用: 常见形式:将对象的的引用存储到公共静态域:非私有方法中返回引用:发布内部类实例,包含引用. 逃逸:在对象尚未准备 ...
- Java线程的概念
1. 计算机系统 使用高速缓存来作为内存与处理器之间的缓冲,将运算需要用到的数据复制到缓存中,让计算能快速进行:当运算结束后再从缓存同步回内存之中,这样处理器就无需等待缓慢的内存读写了. 缓 ...
- Java 线程池框架核心代码分析--转
原文地址:http://www.codeceo.com/article/java-thread-pool-kernal.html 前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和 ...
- 细说进程五种状态的生老病死——双胞胎兄弟Java线程
java线程的五种状态其实要真正高清,只需要明白计算机操作系统中进程的知识,原理都是相同的. 系统根据PCB结构中的状态值控制进程. 单CPU系统中,任一时刻处于执行状态的进程只有一个. 进程的五种状 ...
- 【转载】 Java线程面试题 Top 50
Java线程面试题 Top 50 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员 的欢迎.大多数待遇丰厚的J ...
- 第24章 java线程(3)-线程的生命周期
java线程(3)-线程的生命周期 1.两种生命周期流转图 ** 生命周期:**一个事物冲从出生的那一刻开始到最终死亡中间的过程 在事物的漫长的生命周期过程中,总会经历不同的状态(婴儿状态/青少年状态 ...
- 第23章 java线程通信——生产者/消费者模型案例
第23章 java线程通信--生产者/消费者模型案例 1.案例: package com.rocco; /** * 生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二, ...
- 第22章 java线程(2)-线程同步
java线程(2)-线程同步 本节主要是在前面吃苹果的基础上发现问题,然后提出三种解决方式 1.线程不安全问题 什么叫线程不安全呢 即当多线程并发访问同一个资源对象的时候,可能出现不安全的问题 对于前 ...
- 第21章 java线程(1)-线程初步
java线程(1)-线程初步 1.并行和并发 并行和并发是即相似又有区别: 并行:指两个或者多个事件在同一时刻点发生. 并发:指两个或多个事件在同一时间段内发生 在操作系统中,并发性是指在一段事件内宏 ...
- [转]Java线程安全总结
最近想将java基础的一些东西都整理整理,写下来,这是对知识的总结,也是一种乐趣.已经拟好了提纲,大概分为这几个主题: java线程安全,java垃圾收集,java并发包详细介绍,java profi ...
随机推荐
- AttributeError: 'ForeignKey' object has no attribute 're' 解决办法
使用 field_object.rel.model.objects.filter(**db_condition) 报错 forekey中存在rel,为什么不能调用? 通过以下语句观察 print(fi ...
- Tyvj1933绿豆蛙的归宿
给出一个有向无环图,起点为1终点为N,每条边都有一个长度,并且从起点出发能够到达所有的点,所有的点也都能够到达终点.绿豆蛙从起点出发,走向终点. 到达每一个顶点时,如果有K条离开该点的道路,绿豆蛙可以 ...
- JNDI Tomcat
1.JNDI的诞生及简介简介 1)服务器数据源配置的诞生 JDBC阶段: 一开始是使用JDBC来连接操作数据库的: 在Java开发中,使用JDBC操作数据库的四个步骤如下: ①加载数据库驱动程序(Cl ...
- BZOJ 2120 数颜色(带修改莫队)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2120 [题目大意] 给出一颜色序列,每次可以修改一个位置的颜色或者询问一个区间不同颜色 ...
- [UOJ348]州区划分
设$f_i$表示选状态为$i$的点的答案,$s_i$表示状态为$i$的点权和,$不存在欧拉回路g_i=[i\,不存在欧拉回路]s_i$ 那么$f_i=\sum\limits_{j\subset i}\ ...
- 协程和IO模型
协程 1.什么是协程 单线程实现并发 在应用程序里控制多个任务的切换+保存状态 优点: 应用程序级别速度要远远高于操作系统的切换 缺点: 多个任务一旦有一个阻塞没有切,整个线程都阻塞在原地 该线程内的 ...
- [Luogu1843]奶牛晒衣服
题目大意: 你要晒n件衣服,第i件衣服有w[i]滴水, 每件衣服每秒钟会自然风干a滴水,将这件衣服放入烘干机中每秒钟会烘干a+b滴水. 一秒钟不可以拆开,问晒干所有的衣服至少要多少时间? 思路: 二分 ...
- [Luogu1462]通往奥格瑞玛的道路
题目大意: 一个n个点,m条边的图,每个边有一个边权,每个点也有一个点权. 现在要找一条从1到n的路径,保证边权和不超过b的情况下,最大点权尽量小. 问最大点权最小能是多少? 思路: 二分答案,然后D ...
- Problem E: 调用函数,整数逆序输出
#include<stdio.h> int reverse(int number)//定义函数 { ;//result用于储存结果 ) { result=result*; i=number ...
- PHP数组和数据结构(上)
1.数组的声明 两种方法: 直接给数组元素赋值 使用array()函数声明 说明: (1)索引数组的下标可以是非连续的值,只要在初始化时指定非连续的下标值即可 如果指定的下标值已经声明过,则属于对变量 ...