java多线程(1) 线程的基本概念

一、线程的基本概念:                        

线程是一个程序里面不同的执行路径。

程序里面不同的执行路径,每一个分支都是一个线程。

进程:静态的概念。机器上的一个class文件,机器上的一个exe文件,这叫一个进程。

机器里面实际上运行的都是线程。

window等。linux等都是多进程,多线程的系统。

CPU的执行是这样的:

CPU速度比较快,一秒钟算好几亿次,它把自己的时间分成一个一个的小时间片,这个时间片我执行你一会,再执行他一会,虽然有几十个线程,

没关系,执行这个一会,执行那个一会,挨着排的都执行一遍,但是对我们人来说,因为它速度太快了,你看起来就好像好多线程在同时执行一样。

但实际上,在一个时间点上, 这个CPU只有一个线程在运行。

如果机器是双CPU,或者是双核,那么确实是多线程。

二、线程的启动和创建:                                

例子1:实现Runnable接口:

package com.cy.thread;

public class TestThread1 {
    public static void main(String[] args) {
        Runner1 r = new Runner1();
        Thread t = new Thread(r);

        //启动一个线程,线程启动必须调用Thread类的start()方法
        //start方法会通知cpu,我现在有个新线程了啊,已经准备好了,您老人家什么时候有时间赶紧给我点时间片。
        t.start();

        for(int i=0; i<100; i++){
            System.out.println("Main Thread:----- " + i);
        }
    }
}

/**
 * 实现了Runnable之后,jdk就知道了,这是一个线程类。
 */
class Runner1 implements Runnable{

    @Override
    public void run() {
        for(int i=0; i<100; i++){
            System.out.println("Runner1: " + i);
        }
    }

}

console:

例子2:继承Thread类:

package com.cy.thread;

public class TestThread1 {
    public static void main(String[] args) {
        Runner1 r = new Runner1();
        r.start();

        for(int i=0; i<100; i++){
            System.out.println("Main Thread:----- " + i);
        }
    }
}

class Runner1 extends Thread{

    @Override
    public void run() {
        for(int i=0; i<100; i++){
            System.out.println("Runner1: " + i);
        }
    }

}

三、线程的状态转换:                                            

new Thread()一个线程之后,不会马上执行而是进入就绪状态,因为cpu很忙,可能正在执行其他程序;

等到cpu有空了,cpu分配时间片执行(调度)这个Thread一会;Thread进入运行状态;

当cpu分配给这个Thread的时间片用完了,或者其他原因故障等,Thread不再执行,阻塞,再次进入就绪状态;

直到这个Thread的程序执行完毕;终止。

四、线程控制的基本方法:                                          

isAlive():            判断线程是否还活着,即线程是否还未终止;就绪、运行、阻塞叫活着。终止了就死了。线程创建完还没启动那也是死的。
getPriority()        获得线程的优先级数值;优先级越高的线程获得的cpu执行的时间越多。
setPriority()        设置线程的优先级数值;
Thread.sleep()        将当前线程睡眠指定毫秒数。
join()            合并某个线程。
yield()            高风亮节,让出cpu,让其他的线程执行,而自己进入就绪状态。
wait()            当前线程进入对象的wait pool;
notify、notifyAll()    唤醒对象的wait pool中的一个/所有等待线程。

五、sleep方法:                                                

package com.cy.thread;

import java.util.Date;

public class TestInterrupt {
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start();
        try {
            /**
             * 在哪个线程里面调用sleep方法,就让哪个线程睡眠。
             */
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        /**
         * interrupt()方法:thread线程在睡眠的时候,将它打断。
         * 这里为了例子演示,让子线程结束。
         * 但这不是让子线程结束的最好方法。
         */
        thread.interrupt();
    }
}

class MyThread extends Thread{

    @Override
    public void run() {
        while(true){
            System.out.println("==="+new Date()+"===");
            try {
                sleep(1000);
            } catch (InterruptedException e) {
                return;
            }
        }

    }
}

console打印:

上面的程序提供一个结束Mythread线程的方法:

/**
 * 提供一个让线程结束的方法:
 * thread.flag = false;   run()方法就不再执行了,run方法一结束,线程就结束了。
 */
class MyThread2 extends Thread{

    boolean flag = true;

    @Override
    public void run() {
        while(flag){
            System.out.println("==="+new Date()+"===");
            try {
                sleep(1000);
            } catch (InterruptedException e) {
                return;
            }
        }

    }
}

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

时间: 2024-12-20 14:30:37

java多线程(1) 线程的基本概念的相关文章

java多线程_01_线程的基本概念

线程:一个程序里边不同的执行路径 例子程序:这个例子程序是一条执行路径.这个程序只有一个分支,就是main方法,叫主线程 public static void main(String[] args) { m1(); } public static void m1(){ m2(); m3(); } public static void m2(){} public static void m3(){} 程序执行示意图: 进程:进程是一个静态的概念,机器上的一个class文件,一个exe文件. 程序的

java多线程下的所的概念

锁和synchronized关键字     为了同步多线程,Java语言使用监视器(monitors),一种高级的机制来限定某一 时刻只有一个线程执行一段受监视器保护的代码.监视器的行为是通过锁来实现的,每一个对象都有一个锁.    每个线程都有一个工作内存,在里面存放从所有线程共享的主内存里拷贝来的变量.为了访问一个共享的变量,一个线程通常先要获得一个锁并刷新它的工作内存,这将共享的值从主内存被拷贝到工作内存.当线程解锁时将会把工作内存里的值写回主内存.&n bsp;   一个线程能多次获得对

Java多线程之线程的通信

Java多线程之线程的通信 在总结多线程通信前先介绍一个概念:锁池.线程因为未拿到锁标记而发生的阻塞不同于前面五个基本状态中的阻塞,称为锁池.每个对象都有自己的锁池的空间,用于放置等待运行的线程.这些线程中哪个线程拿到锁标记由系统决定.前面我们也有T到死锁的概念,线程互相等待其他线程释放锁标记,而又不释放自己的:造成无休止地等待.当出现死锁的时候,我们应该如何解决呢?通过线程间的通信解决. 线程间通信: 多线程之间的通信有2种方式,第一种是使用object类的几个方法,第二种是使用条件变了来控制

Java多线程之线程结束清理

该事例说明了清理工作必须要放在finally块中 package Thread.Interrupting; import java.util.concurrent.TimeUnit; class NeedsCleanup { private final int id; public NeedsCleanup(int ident) { id = ident; System.out.println("NeedsCleanup " + id); } public void cleanup()

Java多线程之线程中断

该例子说明,Sleep可以被中断,但是I/O和synchronized不能被中断. package Thread.Interrupting; import java.io.IOException; import java.io.InputStream; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; imp

java多线程之线程的同步与锁定(转)

一.同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 例如:两个线程ThreadA.ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据. publicclass Foo { privateint x = 100; publicint getX() { return x;     } publicint fix(int y) {         x = x - y; return x;     } } publicclass MyRunnable i

java多线程之 ---- 线程死锁

java多线程之线程死锁 产生死锁的主要原因: 因为系统资源不足. 进程运行推进的顺序不合适. 资源分配不当等. 如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁.其次, 进程运行推进顺序与速度不同,也可能产生死锁. 产生死锁的四个必要条件:  互斥条件:一个资源每次只能被一个进程使用. 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放. 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺. 循环等待条件:若干进

java多线程之 ---- 线程同步

java多线程之线程同步 线程同步 定义:同步是指在同一时间段内只能运行一个线程. 分类:同步方法.同步块. 作用:安全解决共享问题. 同步块: 语法: synchronized (同步对象) { 需要同步的代码; } 例子: public class ThreadDemo implements Runnable{ private int ticket = 5; public void run(){ for(int i=1;i<=5;i++){ synchronized (this){ if(t

JAVA多线程之线程间的通信方式

一,介绍 本总结我对于JAVA多线程中线程之间的通信方式的理解,主要以代码结合文字的方式来讨论线程间的通信,故摘抄了书中的一些示例代码. 二,线程间的通信方式 ①同步 这里讲的同步是指多个线程通过synchronized关键字这种方式来实现线程间的通信. 参考示例: public class MyObject { synchronized public void methodA() { //do something.... } synchronized public void methodB()

Java多线程之线程的同步

Java多线程之线程的同步 实际开发中我们也经常提到说线程安全问题,那么什么是线程安全问题呢? 线程不安全就是说在多线程编程中出现了错误情况,由于系统的线程调度具有一定的随机性,当使用多个线程来访问同一个数据时,非常容易出现线程安全问题.具体原因如下:   1,多个线程同时访问一个数据资源(该资源称为临界资源),形成数据发生不一致和不完整.   2,数据的不一致往往是因为一个线程中的多个关联的操作(这几个操作合成原子操作)未全部完成. 关于线程安全问题,有一个经典的情景:银行取钱.代码如下: /