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

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

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

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

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

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. 常用MVC框架

    J2EE开常用的SSH或SSI框架,对应解决表示层.业务逻辑层.持久化层的问题,其中对表示层的解决方案最多,常见的有Struts1/2,Spring MVC等,实际上都是在最底层的Servlet规范中 ...

  2. 【JAVA编码专题】UNICODE,GBK,UTF-8区别 分类: B1_JAVA 2015-02-10 21:07 153人阅读 评论(0) 收藏

    简单来说,unicode,gbk和大五码就是编码的值,而utf-8,uft-16之类就是这个值的表现形式.而前面那三种编码是一兼容的,同一个汉字,那三个码值是完全不一样的.如"汉"的uncode值与g ...

  3. 细说document.ready和window.onload

    原文 简书原文:https://www.jianshu.com/p/bbf28d61aa1f 大纲 1.对页面加载的认识 2.关于document.ready() 3.关于document.onloa ...

  4. tc

    [em_Compare]cmd=d:\Apps\BeyondCompare4\now\BCompare.exeparam="""%X%P%S"" &q ...

  5. ios开发Base64编码以及加密相关学习

    一:.Base64补充 ```objc 1.Base64简单说明 描述:Base64可以成为密码学的基石,非常重要. 特点:可以将任意的二进制数据进行Base64编码 结果:所有的数据都能被编码为并只 ...

  6. 【codeforces 742C】Arpa's loud Owf and Mehrdad's evil plan

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  7. Android Material Design 5.0 PickerDialog

    5.0系统下的时间选择器效果图: 该项目兼容到3.0下面所以用第三方开源项目:actionbarsherlock,动画效果兼容:nineoldandroids-2.4.0.jar,格式转换器:joda ...

  8. PHP移动互联网开发笔记(4)——自定义函数及数组

    一.自定义函数 自定义函数就是我们自己定义的函数,在PHP中自定义函数格式如下: function funname(arg1, arg2, arg3......){ //TODO return val ...

  9. 妈蛋:kinMaxShow轮播图异常,WebUploader图片上传坑爹,图片被压缩了

    今天晚上在改造轮播图. 原来的代码是这样的: <div> <img src="${static}/image/index/banner/`.jpg" /> ...

  10. PatentTips - Systems, methods, and devices for dynamic resource monitoring and allocation in a cluster system

    BACKGROUND  1. Field  The embodiments of the disclosure generally relate to computer clusters, and m ...