Java总结之线程
【线程的基本概念】
线程是一个程序内部的顺序控制流。
线程和进程的差别:
每一个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销。
线程能够看成是轻量级的进程,同一类线程共享代码和数据空间,每一个县城有独立的执行站和程序计数器(PC),线程切换的开销小。
多进程:在操作系统中能同一时候执行多个任务(程序)
多线程:在同一应用程序中有多个顺序流同一时候运行
Java的线程是通过java.lang.Thread类来实现的。
VM启动时会有一个由主方法(public static void main(){})所定义的线程。
能够通过创建Thread的实例来创建新的线程。
每一个线程都是通过摸个特定Thread对象所相应的方法run()来完毕其操作的,方法run()称为线程体。
通过调用Thread类的start()方法来启动一个线程。
【线程控制基本方法】
isAlive() 推断线程是否还“活”着。即线程是否还未终止。
getPriority() 获得线程的优先级数值
setPriority() 设置现成的优先级数值
Thread.sleep() 将当前线程睡眠指定毫秒数
join() 调用某线程的该方法。将当前线程与该线程“合并”,即等待该线程结束,再恢复当前线程的执行。
yield() 让出CPU,当前线程进入就绪队列等待调度。
wait() 当前线程进入对象的wait pool。
notify()/notifyAll() 唤醒对象的wait pool中的一个/全部等待线程。
【sleep/join/yield方法】
sleep方法
能够调用Thread的静态方法:
public static void sleep(long millis) throws InterruptedExcepion
使得当前线程休眠(临时停止运行millis毫秒)
因为是静态方法,sleep能够由类名直接调用:
Thread.sleep(...)
join方法
合并某个线程
yield方法
让出CPU。给其它线程运行的机会
join范例:
public class TestJoin extends Thread{
public static void main(String[] args) {
MyThread t1 = new MyThread("t1");
t1.start();
try {t1.join();}
catch (InterruptedException e) {}
for(int i=1;i<=10;i++) {
System.out.println("i am main thread");
}
}
}
class MyThread extends Thread {
MyThread(String s) {super(s);}
public void run() {
for(int i=1;i<=10;i++) {
System.out.println("i am "+getName());
try {sleep(1000);}
catch (InterruptedException e) {return;}
}
}
}
yield范例:
public class TestYield {
public static void main(String[] args) {
MyThread t1 = new MyThread("t1");
MyThread t2 = new MyThread("t2");
t1.start(); t2.start();
}
}
class MyThread extends Thread {
MyThread(String s) {super(s);}
public void run() {
for(int i=1;i<=100;i++) {
System.out.println(getName()+": "+i);
if(i%10==0) {
yield();
}
}
}
}
【线程的优先级别】
Java提供一个线程调度器来监控程序中启动后进入就绪状态的全部线程。
线程调度器依照线程的优先级决定应调度那个线程来运行。
线程的优先级用数字表示,范围从1到10,一个线程的缺省优先级是5.
Thread.MIN_PRIORITY = 1
Thread.MAX_PRIORITY = 10
Thread.NORM_PRIORITY = 5
使用下述方法获得或设置线程对象的优先级。
int getPriority();
void setPriority(int new Priority);
Priority范例:
public class TestPriority {
public static void main(String[] args) {
Thread t1 = new Thread(new T1());
Thread t2 = new Thread(new T2());
t1.setPriority(Thread.NORM_PRIORITY + 3);
t1.start();
t2.start();
}
}
class T1 implements Runnable {
public void run() {
for(int i=0;i<100;i++) {
System.out.println("T1: "+i);
}
}
}
class T2 implements Runnable {
public void run() {
for(int i=0;i<100;i++) {
System.out.println("------T2: "+i);
}
}
}
【线程同步】
在Java语言中,引入了对象相互排斥锁的概念,保证共享数据操作的完整性。
每一个对象都相应于一个可称为"相互排斥锁"的标记,这个标记保证在随意时刻,仅仅能有一个线程訪问该对象。
keywordsynchronized来与对象相互排斥锁联系。当某个对象synchronized修饰时,表明该对象在随意时刻仅仅能由一个线程訪问。
synchronized 的用法:
synchronized(this) {...}
synchronized还能够放在方法声明中。表示整个方法为同步方法,比如:
synchronized public void add(String name) {...}
范例:
public class TestSync implements Runnable {
Timer timer = new Timer();
public static void main(String[] args) {
TestSync test = new TestSync();
Thread t1 = new Thread(test);
Thread t2 = new Thread(test);
t1.setName("t1");
t2.setName("t2");
t1.start();
t2.start();
}
public void run() {
timer.add(Thread.currentThread().getName());
}
}
class Timer {
private static int num = 0;
public synchronized void add(String name) {
//synchronized (this) {
num ++;
try {Thread.sleep(1);}
catch (InterruptedException e) {}
System.out.println(name+", 你是第"+num+"个使用timer的线程");
//}
}
}
【死锁】
范例:
public class TestDeadLock implements Runnable {
public int flag = 1;
static Object o1 = new Object(), o2 = new Object();
public void run() {
System.out.println("flag=" + flag);
if(flag == 1) {
synchronized(o1) {
try {Thread.sleep(500);}
catch (Exception e) {
e.printStackTrace();
}
synchronized(o2) {
System.out.println("1");
}
}
}
if(flag == 0) {
synchronized(o2) {
try {Thread.sleep(500);}
catch (Exception e) {
e.printStackTrace();
}
synchronized(o1) {
System.out.println("0");
}
}
}
}
public static void main(String[] args) {
TestDeadLock td1 = new TestDeadLock();
TestDeadLock td2 = new TestDeadLock();
td1.flag = 1;
td2.flag = 0;
Thread t1 = new Thread(td1);
Thread t2 = new Thread(td2);
t1.start();
t2.start();
}
}
Java总结之线程的更多相关文章
- 小谈Java里的线程
今天,我们来谈一谈Java里的线程. 一.进程与线程的基本概念 大家可能没听过线程这个概念,但是相信,用计算机的朋友都听过进程这个概念.打开电脑的任务管理器,我们就可以看到许多进程.它们主要分为三类, ...
- Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor
介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异步任务你还只是如下new T ...
- 【转】关于Java的Daemon线程的理解
原文地址:http://www.cnblogs.com/ChrisWang/archive/2009/11/28/1612815.html 关于Java的Daemon线程的理解 网上对Java的Dae ...
- Java四种线程池
Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor 时间:20 ...
- java笔记--使用线程池优化多线程编程
使用线程池优化多线程编程 认识线程池 在Java中,所有的对象都是需要通过new操作符来创建的,如果创建大量短生命周期的对象,将会使得整个程序的性能非常的低下.这种时候就需要用到了池的技术,比如数据库 ...
- Java中的线程
http://hi.baidu.com/ochzqvztdbabcir/item/ab9758f9cfab6a5ac9f337d4 相濡以沫 Java语法总结 - 线程 一 提到线程好像是件很麻烦很复 ...
- [译]线程生命周期-理解Java中的线程状态
线程生命周期-理解Java中的线程状态 在多线程编程环境下,理解线程生命周期和线程状态非常重要. 在上一篇教程中,我们已经学习了如何创建java线程:实现Runnable接口或者成为Thread的子类 ...
- Java多线程和线程池
转自:http://blog.csdn.net/u013142781/article/details/51387749 1.为什么要使用线程池 在Java中,如果每个请求到达就创建一个新线程,开销是相 ...
- Java并发编程:线程和进程的创建(转)
Java并发编程:如何创建线程? 在前面一篇文章中已经讲述了在进程和线程的由来,今天就来讲一下在Java中如何创建线程,让线程去执行一个子任务.下面先讲述一下Java中的应用程序和进程相关的概念知识, ...
- Java并发3-多线程面试题
1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速. 2) 线程和进程有什 ...
随机推荐
- python 异步IO-aiohttp与简单的异步HTTP客户端/服务器
参考链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143209814 ...
- ZJU 1346 Comparing Your Heroes 状态压缩DP 拓扑排序的计数
做多校的时候遇见一个求拓扑排序数量的题,就顺便来写了一下. 题意: 你有个朋友是KOF的狂热粉丝,他有一个对其中英雄的强弱比较,让你根据这些比较关系来给这些英雄排名.问一共有多少种排名方式. 思路: ...
- Varnish 问题点 与 技术方案 Varnish 优劣分析
A10 有没有能做热点统计 1 Varnish 分布式 HA (目前没有HA) 2 Varnish 热点监控 (建议热点需要外部插件统计,API的话目前并木有发现,但是他自带一个伪热 ...
- Mac系统下安装ant
看了一些别人怎么在mac下安装ant,大体都是从官网下载bin文件,然后改动权限,建链接.配path. 须要这么麻烦吗?我认为不须要. 以下一个命令搞定: forlong401:build forlo ...
- C++ 鼠标模拟程序
关于鼠标模拟程序应用不算少见.在游戏外挂或者一些操作频繁位置确定的程序上应用往往有奇效. 比較旧的API是mouse_event,本人一開始也用这个在搞,只是后来才看到新的API在操作上更加统一.稍作 ...
- DMA在FPGA的应用之我见
首先,来做一个简单的实验,利用DMA来实现on-chip-memory和SRAM之间的传输,同时也在做一个关于SRAM不同地址之间的传输. 一.硬件设计 1.首先设计自己的SOPC结构,包括CPU.j ...
- modSecurity规则学习(六)——检测模式
传统检测模式-自主规则 传统检测模式所有规则都是“闭环”的模式.就像HTTP本身一样,单独的规则是无状态的.这意味着规则之间不共享信息,每个规则都没有关于任何先前规则匹配的信息.它仅使用其当前的单个规 ...
- 特性Attibute定义和使用
1.定义特性 [AttributeUsage(AttributeTargets.Class,AllowMultiple = false,Inherited = false)] public class ...
- POJ 1986 裸的LCA
思路:搞了一发链剖 //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> ...
- 水 hdu5208 2015-04-20 21:03 36人阅读 评论(0) 收藏
题意: 选择数列中两个数,使得最大公约数最大 分析: 类似筛选法,因为数值不大,可以用b[i]计算i是多少个数的因子.最后取最大的i即可. #include <bits/stdc++.h> ...