进程:是一个程序在其自身的地址空间的一次执行活动。

线程:(区别于进程)线程没有独立的存储空间。

几个概念:时间片 线程  进程  

能不能够用多进程代替多线程呢?

两个进程切换时要交换内存空间,而多线程切换时效率比较高,所以通常多个任务采用多线程,不要开启大量的进程。

java在语言级别提供了对多线程程序设计的支持

实现多线程程序的两种方式:

1,从Thread类继承

2,实现Runable接口

----------------------------------------------------------------------------------

package pack02;

//得到main函数的线程名

public class MultiThread {

public static void main(String[] args){

Thread thread = Thread.currentThread();  //得到当前线程

String string = thread.getName();    //得到线程名

System.out.println(string);

}

}

----------------------------------------------------------------------------------

package pack02;

//得到线程类的线程名

public class MultiThread {

public static void main(String[] args){

MyThread mt = new MyThread();

mt.start();   //启动线程

}

}

class MyThread extends Thread{  //Thread实现了Runable接口

public void run(){

System.out.println(getName());  //继承了getName()方法

}

}

----------------------------------------------------------------------------------

package pack02;





public class MultiThread {

public static void main(String[] args){

MyThread mt = new MyThread("i am thread");  //给线程命名

mt.start();   //启动线程

}

}

class MyThread extends Thread{

public MyThread(String str){  //调用有参数的构造

super(str);

}

public void run(){

System.out.println(getName());  //继承了getName()方法

}

}

----------------------------------------------------------------------------------

 void setDaemon(boolean on) //后台线程

          将该线程标记为守护线程或用户线程。 

前台线程是可以阻止进程终止的,而后台线程在进程终止后终止。

----------------------------------------------------------------------------------

package pack02;





public class MultiThread {

public static void main(String[] args){

MyThread mt = new MyThread("i am thread");

mt.setDaemon(true);  //设为后台线程

mt.start();   //启动线程


int i = 0;

while(true){

if(i++ == 10000){

break;

}

System.out.println(Thread.currentThread().getName());

}

}

}

class MyThread extends Thread{

public MyThread(String str){

super(str);

}

public void run(){

while(true){

System.out.println(getName());  //继承了getName()方法

}

}

}

-----------------------------------------------------------------------------------------

yeid()方法  :放弃自己执行的权力,让其他线程执行

------------------------------------------------------------------------------------

package pack02;





public class MultiThread {

public static void main(String[] args){

MyThread mt = new MyThread("i am thread");

mt.setDaemon(true);  //设为后台线程

mt.start();   //启动线程


int i = 0;

while(true){

if(i++ == 10000){

break;

}

System.out.println(Thread.currentThread().getName());

}

}

}

class MyThread extends Thread{

public MyThread(String str){

super(str);

}

public void run(){

while(true){

System.out.println(getName());  //继承了getName()方法

yield();   //线程休眠

}

}

}

---------------------------------------------------------------------------------------

MAX_PRIORITY(10)  MIN_PRIORITY(1)  NORM_PRIORITY(5)设置线程的优先级

package pack02;





public class MultiThread {

public static void main(String[] args){

MyThread mt = new MyThread("i am thread");

mt.setPriority(Thread.MAX_PRIORITY);

mt.start();   //启动线程


int i = 0;

while(true){

if(i++ == 10000){

break;

}

System.out.println(Thread.currentThread().getName());

}

}

}

class MyThread extends Thread{

public MyThread(String str){

super(str);

}

public void run(){

while(true){

System.out.println(getName());  //继承了getName()方法  //线程休眠

}

}

}

--------------------------------------------------------------------------------

Java运行时系统实现了一个用于调度线程执行的线程调度器,用于确定某一时刻由哪一个线程在CPU上运行。

Java中线程是抢占式的而不需要时间片分配进程。

实现Runnable接口的好处:

1,实现接口可以实现多个接口和再继承

2,可以创建多个线程而用同一个属性(变量)

------------------------------------------------------------------------------------

package pack02;





public class MultiThread {

public static void main(String[] args){

MyThread mt = new MyThread();

new Thread(mt).start();  //线程1

new Thread(mt).start();  //线程2

new Thread(mt).start();  //线程3

new Thread(mt).start();  //线程4

int i = 0;

while(true){

System.out.println(Thread.currentThread().getName());

}

}

}

class MyThread implements Runnable{

int i = 0;  //共用同一个变量

public void run(){

while(true){

System.out.println(Thread.currentThread().getName()+":"+i++);  //继承了getName()方法  //线程休眠

}

}

}

------------------------------------------------------------------------------------

package pack02;

//内部内实现多线程共用一个变量

public class MultiThread {

public static void main(String[] args){

MyThread mt = new MyThread();

mt.getTread().start();   //启动线程1

mt.getTread().start();   //启动线程2

mt.getTread().start();   //启动线程3

mt.getTread().start();   //启动线程4

int i = 0;

while(true){

System.out.println(Thread.currentThread().getName());

}

}

}

class MyThread{

int i = 0;  //共用同一个变量

class InnerThread extends Thread{  //写一个内部内实现多线程共用变量

public void run(){

while(true){

System.out.println(getName()+":"+i++);

}

}

}

Thread getTread(){

return new InnerThread();

}

}

--------------------------------------------------------------------------------------

package pack02;

//火车站订票系统

public class TicksSystem {

public static void main(String[] args){

SellTread st = new SellTread();

new Thread(st).start();

new Thread(st).start();

new Thread(st).start();

new Thread(st).start();

}

}

class SellTread implements Runnable{





int tickets = 100;

public void run() {

while(true){

if(tickets>0){  //这里会出现问题可能售出0,-1,-2,-3的票

try {

Thread.sleep(10);  //用于测试

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName()+"sell tickes"+tickets);

tickets--;

}

}



}



}

-----------------------------------------------------------------------------------------

线程的同步:

每一个对象都有一把锁子

同步块

-----------------------------------------------------------------------------------------

package pack02;





public class TicksSystem {

public static void main(String[] args){

SellTread st = new SellTread();

new Thread(st).start();

new Thread(st).start();

new Thread(st).start();

new Thread(st).start();

}

}

class SellTread implements Runnable{





int tickets = 100;

Object obj = new Object();

public void run() {

synchronized(obj){  //obj对象拿出了自己的锁子

while(true){

if(tickets>0){

try {

Thread.sleep(10);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName()+"sell tickes"+tickets);

tickets--;

}

}

}

}

}

--------------------------------------------------------------------------------------------

同步方法

-------------------------------------------------------------------------------------------

package pack02;





public class TicksSystem {

public static void main(String[] args){

SellTread st = new SellTread();

new Thread(st).start();

new Thread(st).start();

new Thread(st).start();

new Thread(st).start();

}

}

class SellTread implements Runnable{





int tickets = 100;

public void run() {

while(true){

sell();

}

}

public synchronized void sell(){ //实际上是给this加锁

if(tickets>0){

try {

Thread.sleep(10);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName()+"sell tickes"+tickets);

tickets--;

}

}

}

----------------------------------------------------------------------------------------------

每个class也有一个锁,是这个class所对应的Class对象的锁。

线程的死锁:

----------------------------------------------------------------------------------------------

package pack02;





public class TicksSystem {

public static void main(String[] args){

SellTread st = new SellTread();

new Thread(st).start();

try {

Thread.sleep(1);

} catch (InterruptedException e) {

e.printStackTrace();

}

st.flag = true;

new Thread(st).start();

}

}

class SellTread implements Runnable{

boolean flag = false;

int tickets = 100;

Object obj = new Object();

public void run() {

if(flag == true){

sell();

}else{

while(true){

synchronized(obj){

try {

Thread.sleep(10);

} catch (InterruptedException e) {

e.printStackTrace();

}

synchronized (this) {

if(tickets>0){

System.out.println(Thread.currentThread().getName()+"sell tickes"+tickets);

tickets--;

}

}

}

}

}

}

public synchronized void sell(){

synchronized (obj) {

if(tickets>0){

try {

Thread.sleep(10);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName()+"sell tickes"+tickets);

tickets--;

}

}

}

}

-------------------------------------------------------------------------------------------------

wait notify notifyAll  (Object中的方法)

每一个对象除了有一个锁之外,还有一个等待队列(waitsct),当一个对象刚创建的时候,它的等待队列

是空的。

我们应该在当前线程锁住对象的锁后,去调用该对象的wait方法。

当调用对象的notify方法时,将从该对象的等待队列中删除一个任意选择的线程,这个线程将再次成为可

运行的线程。

当调用对象的notifyAll方法时,将从该对象的等待队列中删除所有等待的线程,这些线程将成为可运行的线程。

wait和notify主要用于producer-consumer这种关系中。

------------------------------------------------------------------------------------------------

package test;

//生产者是一个对象

//消费者是个对象

//中转站是个对象

//wait 和 notify 必须放在同步块中或同步方法中(必须是同一个对象)

//该例子中调用的都是this对象的wait和notify方法

public class Test {

public static void main(String[] args){

Queue queue = new Queue();

Producer p = new Producer(queue);

Consumer c = new Consumer(queue);

p.start();

c.start();

}

}

class Producer extends Thread{ //生产者

Queue q;

public Producer(Queue q) {

this.q = q;

}

public void run(){

for(int i=0;i<10;i++){

System.out.println("Producer put" + i);

q.put(i);

}

}

}





class Consumer extends Thread{ //消费者

Queue q;

public Consumer(Queue q){

this.q = q;

}

public void run(){

while(true){

System.out.println("Consumer get" + q.get());

}

}

}

class Queue{  //中专站

int value;

boolean bFull = false;

public synchronized void put(int i){ //this对象的监视器

if(!bFull){  //没有数据

value = i;  //放置数据

bFull = true; //放过数据

notify(); //通知消费者获取数据

}

try {

wait(); //等待消费者获取数据

} catch (InterruptedException e){

e.printStackTrace();

}

}

public synchronized int get(){

if(!bFull){  //没有数据

try {  

wait(); //等待放数据 

} catch (InterruptedException e) {

e.printStackTrace();

}

}

bFull = false;  //有数据

notify();  //通知生产者继续放置数据

return value;  //得到数据

}

}

--------------------------------------------------------------------------------------------

线程的状态:



New--------->Runnable-------slep,wait,suspend,I/O阻塞------------------>Not Runnable



 <------------sleep结束,notify,resume,I/O操作完成---

终止线程的方法:

设置一个flag变量终止线程。

interrupt()方法

----------------------------------------------------------------------------------------------

package test;





public class Test{

public static void main(String[] args) {

Thread1 t1 = new Thread1();

t1.start();

int index = 0;

while(true){

if(index++ == 500){

t1.stopThread();

t1.interrupt(); 

break;

}

System.out.println(Thread.currentThread().getName()+index);

}

System.out.println("main exit");

}

}





class Thread1 extends Thread{

private boolean bStop = false;

public synchronized void run(){

while(!bStop){

try {

wait();

} catch (InterruptedException e) {

e.printStackTrace();

if(bStop) return;

}

System.out.println(getName());

}

}

public void stopThread(){

bStop = true;

}

}

------------------------------------------------------------------------------------------

java的语言规范:

http://java.sun.com/docs/books/jls/second_edition/html/jTOC.doc.html

java学习笔记(8)——多线程的更多相关文章

  1. 【原】Java学习笔记032 - 多线程

    package cn.temptation; public class Sample01 { public static void main(String[] args) { /* * [进程]:正在 ...

  2. Java学习笔记之——多线程

    多线程编程 程序: 进程:一个程序运行就会产生一个进程 线程:进程的执行流程,一个进程至少有一个线程,称为主线程 如:QQ聊着天,同时在听音乐 一个进程可以有多个线程,多个线程共享同一个进程的资源 线 ...

  3. Java学习笔记:多线程(一)

    Java中线程的五种状态: 新建状态(New) 就绪状态(Runnable) 运行状态(Running) 阻塞状态(Blocked) 凋亡状态(Dead) 其中阻塞状态(Blocked)又分为三种: ...

  4. java学习笔记(5)多线程

    一.简介(过段时间再写,多线程难度有点大) --------------------------------------- 1.进程:运行时的概念,运行的应用程序 2.线程:应用程序内部并发执行的代码 ...

  5. Java 学习笔记(11)——多线程

    Java内部提供了针对多线程的支持,线程是CPU执行的最小单位,在多核CPU中使用多线程,能够做到多个任务并行执行,提高效率. 使用多线程的方法 创建Thread类的子类,并重写run方法,在需要启动 ...

  6. Java学习笔记:多线程(二)

    与线程生命周期相关的方法: sleep 调用sleep方法会进入计时等待状态,等待时间到了,进入就绪状态. yield 调用yield方法会让别的线程执行,但是不确保真正让出.较少使用,官方注释都说 ...

  7. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁

    什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...

  8. Java学习笔记-多线程-创建线程的方式

    创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...

  9. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  10. 20145330第六周《Java学习笔记》

    20145330第六周<Java学习笔记> . 这周算是很忙碌的一周.因为第六周陆续很多实验都开始进行,开始要准备和预习的科目日渐增多,对Java分配的时间不知不觉就减少了,然而第十和十一 ...

随机推荐

  1. 2、JNI说明

    JNI (Java Native Interface) 1. JAVA调用CLinux是用C语言写的,可以写一个APP简单调用open,read,write来访问驱动程序;Android是用Java写 ...

  2. 自己定义Dialog的具体步骤(实现自己定义样式一般原理)

    转载请标注转载http://blog.csdn.net/oqihaogongyuan/article/details/50958659 自己定义Dialog的具体步骤(实现自己定义样式一般原理)    ...

  3. 【a903】石子归并

    Time Limit: 10 second Memory Limit: 2 MB 问题描述 在一个圆形操场的四周摆放着N堆石子(N<= 100),现要将石子有次序地合并成一堆.规定每次只能选取相 ...

  4. ZOJ 2514 Generate Passwords 水

    啦啦啦,水一发准备去复习功课~ ------------------------------------------水一发的分割线----------------------------------- ...

  5. poj 2955 Brackets 括号匹配 区间dp

    题意:最多有多少括号匹配 思路:区间dp,模板dp,区间合并. 对于a[j]来说: 刚開始的时候,转移方程为dp[i][j]=max(dp[i][j-1],dp[i][k-1]+dp[k][j-1]+ ...

  6. jquery-11 如何实现标签的鼠标拖动效果

    jquery-11 如何实现标签的鼠标拖动效果 一.总结 一句话总结:核心原理:1.标签实现绝对定位,位置的话跟着鼠标走.2.点击标签的话,给标签绑定事件,停止按住鼠标的话,解除绑定的事件. 1.事件 ...

  7. VS(Visual Studio)自动创建的文件格式

    .sln:solution,解决方案文件: .vsxproj:解决方案下的项目文件: .vssettings:环境设置文件, 菜单栏 ⇒ [工具]⇒ [导入和导出设置]⇒ 进行环境设置的导入和导出操作 ...

  8. [Grid Layout] Use the repeat function to efficiently write grid-template values

    We can use the repeat() function if we have repeating specifications for columns and rows. With the  ...

  9. [Angular] Scrolling the Message List To the Bottom Automatically Using OnChanges

    Let's say the message list can Input (messages) from parent component, and what we want to do is whe ...

  10. 【hdu 3537】Daizhenyang's Coin

    Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...