本篇将为大家总结JAVA中的线程机制,谈到线程,大家一定会问线程和进程有什么区别?刚接触进程时我也有这样的疑问,今天就为大家简单介绍一下进程和线程。进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础;线程是程序内部的顺序控制流。它们的区别:

每个进程都有独立的代码和数据空间,进程间的切换会有较多的开销;线程可以看做轻量级的进程,同以进程共享代码块和数据空间,每个进程有独立的运行栈和程序计数器(PC),线程间切换开销小。

  JAVA的线程是通过java.lang.Thread类来实现的,VM启动时会有一个由主方法(public static void main(){})所定义的线程。可以通过创建Thread的实例来创建新的线程。每个线程都是通过某个特定的Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。通过调用Thread的start()的方法来启动线程。

 1、线程的创建与启动:

public class Th {
/**
* @param 线程的创建与启动
*/
public static void main(String[] args) {
//第一种线程创建方式
Runnable run = new myRunnable();
Thread th1 = new Thread(run);
//第二种线程创建方式
myThread th2 = new myThread();
//线程启动
th1.start();
th2.start();
for(int i=0; i<50; i++){
System.out.println("主线程");
}
}
} class myRunnable implements Runnable{
public void run() {
for(int i=0; i<50; i++){
System.out.println("线程一");
}
}
} class myThread extends Thread{
public void run() {
for(int i=0; i<50; i++){
System.out.println("线程二");
}
}
}

 2、线程的基本控制:

  

 3、sleep、join、yield:

  sleep(int time):休眠,当前线程休眠time毫秒

  join():线程合并

  yield:让出CPU,给其它线程执行的机会

  实例代码:

public class SJY {

    /**
* @param sleep、join、yield的使用
*/
public static void main(String[] args) {
Runnable run = new myRun();
Thread th1 = new Thread(run);
myTh th2 = new myTh();
for(int i=0; i<50; i++){
if(i!=25){
System.out.println("主线程");
}else{
th1.yield();//让出CPU
}
}
th1.start();
th2.start();
try {
th1.join();//线程合并
th1.sleep(1000*3);//休眠3秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} class myRun implements Runnable{
public void run() {
for(int i=0; i<50; i++){
System.out.println("线程一");
}
}
} class myTh extends Thread{
public void run() {
for(int i=0; i<50; i++){
System.out.println("线程二");
}
}
}

 4、线程优先级:

  JAVA提供了一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器根据线程的优先级决定应调那个线程来执行。线程的优先级用数字表示,范围从1~10,一个线程的缺省优先级为5。Thread.MIN_PRIORITY=1;Thread.MAX_PRIORITY=10;Thread.NORM_PRIORITY=5。

  使用下述方式获得线程的优先级和设置线程的优先级:int getPriority():获得线程的优先级,void setPriority(int newPriority):设置线程的优先级

 5、线程同步:

  线程同步是什么意思呢?这里加入了锁的机制,synchronized是JAVA中加锁的关键字。对于线程同步请看下面的实例:

public class SYN implements Runnable{

    /**
* @param 互斥锁,线程同步
*/
Text text = new Text();
public static void main(String[] args) {
SYN syn = new SYN();
Thread th1 = new Thread(syn);
Thread th2 = new Thread(syn);
th1.setName("th1");
th2.setName("th2");
th1.start();
th2.start();
}
public void run() {
text.add(Thread.currentThread().getName());
}
} class Text {
private static int num=0;
public synchronized void add(String name){
//synchronized (this) {//加锁,保证线程同步
num++;
try {
Thread.sleep(1);
System.out.println(name+",你是第"+num+"个使用Text的线程");
} catch (InterruptedException e) {
e.printStackTrace();
}
//}
}
}

 6、死锁:

public class Test implements Runnable{
/**
* @param 死锁
*/
public static void main(String [] args){
Test t1 = new Test();
Test t2 = new Test();
t1.flag=1;
t2.flag=0;
Thread th1 = new Thread(t1);
Thread th2 = new Thread(t2);
th1.start();
th2.start();
}
private int flag = 1;
static Object o1 = new Object();
static Object o2 = new Object();
public void run() {
System.out.println("flag="+flag);
if(flag == 1){
synchronized (o1) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2) {
System.out.println("1");
}
}
}
if(flag == 0){
synchronized (o2) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o1) {
System.out.println("2");
}
}
}
}
}

  到这里JAVA线程总结就完成了。下一篇网络编程。

javase基础复习攻略《九》的更多相关文章

  1. javase基础复习攻略《一》

    作为一名软件工程专业,JAVA开发方向的大三本科学生,有必要把自己的学到的专业知识进行一下整理,一则方便自己了解自己的学习程度,二则帮助刚刚接触这一门语言的童鞋了解学习,本人来自与河南理工大学,介绍完 ...

  2. javase基础复习攻略《十》

    按照计划本篇为大家总结JAVA的网络编程,什么叫网络编程呢?网络编程!=网站编程,对于这一点大家一定要注意,很多小朋友都曾经这么认为.既然谈到网络编程,咱们先了解一下网络的基础知识,什么是计算机网络? ...

  3. javase基础复习攻略《二》

    今天就开始的真正走进JAVASE的世界,本篇介绍的是:JAVASE基础语法,大家如果有C语言的基础,对于本节内容一定感觉非常轻松,编程语言之间的都是相通的,只不过C语言属于面向过程编程,而JAVA语言 ...

  4. javase基础复习攻略《三》

    编程语言的发展: 机器语言——直接由计算机的指令组成,指令.地址.数据都是以"0"和"1"的符号串组成,可以被计算机直接执行. 汇编语言——用容易理解和记忆的符 ...

  5. javase基础复习攻略《八》

    进入第八篇,我们开始讨论JAVA的IO初步.在JAVA程序中,对数据的输入\输出操作以"流"(stream)方式进行,J2SDK提供了各种各样的"流"类,用于获 ...

  6. javase基础复习攻略《五》

    总结完JAVA的基础语法和面向对象思想后,今天为大家补充一下JAVA中的数组,数组是什么呢?大家是不是想到了集合,数组和集合有相似之处,集合中的数据无序,不可以重复.数组中则存放着具有相同特征的一组数 ...

  7. javase基础复习攻略《七》

    容器是什么?通俗的讲容器指可以装其它东西的器皿,前面我们提到的数组便是容器的一种,容器的概念在JAVA中便可以理解为用来存储其它对象的器皿.本篇就让我们一起来认识一下JAVA为我们提供的容器类. 1. ...

  8. javase基础复习攻略《六》

    学习JAVA的同学都知道,sun为我们封装了很多常用类,本篇就为大家总结一下我们经常使用的类.上一篇博客一位朋友留言问我String是不是引用数据类型?我通过查找资料发现String属于应用数据类型, ...

  9. javase基础复习攻略《四》

    本篇内容重点介绍JAVA中的异常处理机制,什么是JAVA异常?JAVA异常是JAVA提供的用于处理程序中错误的一种机制.所谓错误就是指在程序的运行过程中出现的一些异常事件(如:0溢出,数组下表越界,所 ...

随机推荐

  1. 搭建一个SSH项目框架的步骤

    1.导入jar包(38个) 2.配置文件 applicationContext,xml (beans.xml) (数据源.LocalSessionFactoryBean.事务管理器.事务通知.AOP切 ...

  2. CXF实现webservice

    虽然网上有很多cxf的教程,但还是要自己写写, “好记性不如烂笔头” 1.服务端 1.1  DEMO,用于测试传递对象 package com.xq.model; import javax.persi ...

  3. java-API中的常用类,新特性之-泛型,高级For循环,可变参数

    API中的常用类 System类System类包含一些有用的类字段和方法.它不能被实例化.属性和方法都是静态的. out,标准输出,默认打印在控制台上.通过和PrintStream打印流中的方法组合构 ...

  4. maven创建 web项目

    Maven教程初级篇03: 创建Web应用 1. 使用如下命令创建Web应用: 代码 mvn archetype:generate -DgroupId=net.jianxi.tutorials.mav ...

  5. 自己搭建云存储(WIFI路由器上接硬盘)

    欢迎转载opendevkit文章, 文章原始地址: http://www.opendevkit.com/?e=49 http://www.cnet.com/how-to/share-an-extern ...

  6. 关于placeholder中 文字添加换行 用转义字符&#13;&#10;代替<br>

    今天遇到一个问题 UI给的效果图中 文本域的提示文字 是两行显示, 于是就想到placeholder中能否解析html标签, 尝试后发现并无卵用, 经过调查后发现 可以用转义字符代替<br> ...

  7. centos 后台执行C#控制台程序

    1. nohup nohup 无疑是我们首先想到的办法.顾名思义,nohup 的用途就是让提交的命令忽略 hangup 信号.让我们先来看一下 nohup 的帮助信息: NOHUP() User Co ...

  8. 基于MVC4+EasyUI的Web开发框架形成之旅--附件上传组件uploadify的使用

    大概一年前,我还在用Asp.NET开发一些行业管理系统的时候,就曾经使用这个组件作为文件的上传操作,在随笔<Web开发中的文件上传组件uploadify的使用>中可以看到,Asp.NET中 ...

  9. reactor & proactor 笔记

    1. 基本概念 1.1 同步/异步,针对应用程序和内核交互而言. 同步:进程触发IO操作等待或轮询查看IO操作是否完成: 异步:进程触发IO操作后仅需自身的处理,IO操作完成后会得到通知(异步的特点) ...

  10. 人人都是 DBA(XIII)索引信息收集脚本汇编

    什么?有个 SQL 执行了 8 秒! 哪里出了问题?臣妾不知道啊,得找 DBA 啊. DBA 人呢?离职了!!擦!!! 程序员在无处寻求帮助时,就得想办法自救,努力让自己变成 "伪 DBA& ...