多线程(01)

  1. 线程是进程中的内容
  2. 每个程序中都必须有线程,因为线程是程序中的控制单元
  3. 进程:是一个正在执行中的程序,每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元
  4. 线程:就是进程中一个独立的控制单元,线程在控制着进程的执行
  5. 一个进程中至少有一个线程
  6. 命令行编译java:

Cd是进入子目录,首先是javac 编译成为.class文件,之后在运行java

  1. java VM(java虚拟机)启动的时候就会有一个进程java.exe,该进程中至少有一个线程负责java程序的执行,并且这个线程运行的代码存在于main方法中,该线程称之为主线程
  2. 扩展:更细节说明jvm,jvm启动不止一个线程,还有负责垃圾回收机制的线程
  3. 通过对api的查找,Java.lang 中的类Thread 创建线程

第一种创建线程的方式:继承Thread类,复写run方法(目的:将自定义的代码存储在run方法中,让线程运行),调用线程的start方法,该方法有两个作用:(1)启用线程(2)调用run方法

  1. 双核CPU :好多程序可以同时跑起来,更快。
  2. 发现运行结果每一次都不同:因为多个线程都在获取CPU的执行权,cpu执行到谁,谁就运行。明确一点,在某一个时刻,只能有一个程序在运行(多核除外)
  3. CPU在做着快速的切换,以达到看上去相同运行的效果。我们可以形象的把多线程的运行行为在互相抢夺cpu的执行权,这就是多线程的一个特性:随机性,谁抢到谁执行,至于执行多长时间,cpu说的算
  4. 为什么覆盖run方法?

Thread类用于描述线程,该类就定义了一个功能,用于存储线程要运行的代码,该存储的功能就是run方法,也就是说Thread类中的run方法,用于存储线程要运行的代码

虚拟机定义了主线程,在main中

注意在多线程中调用继承了Thread的类  调用.strat()方法和.run()方法的区别:

  • d.start(); // 开启线程并执行该线程的run方法
  • d.run();//仅仅是对象调用方法,线程创建了但并未运行

代码例子:

package sxy;

class Demo extends Thread {
    public void run() { // 重写run方法
        for(int i=0;i<20;i++){
            System.out.println("demo run"+i);
        }
        
    }

}

public class Helloworld {

    /**
     * @param args
     */

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Demo d = new Demo();  //创建了一个线程
        d.start();  // 开启线程并执行该线程的run方法
        //d.run();//仅仅是对象调用方法,线程创建了但并未运行
      
        for(int i=0;i<20;i++){
            System.out.println("hello world"+i);
        }

    }

}

调用.start()每次运行的结果都是不一样的

 调用.run()方法 则就是执行完run方法中的for循环,再执行main函数里面的for循环

线程的状态:

Thread中的一些方法

1.Thread.currentThread(): 静态的 ,返回对当前正在执行的线程对象的引用 Thread.currentThread()=this   

2..getName() 得到当前线程的名字

3.设置线程的名称:.setName()或者构造函数

实现多线程的第一种方法:

 1.实现简单的买票,多个窗口可以实现同时买票:

package sxy;

class Tickect extends Thread {
    private static int tick = 100;  //限制总的票数,否则四个进程四个
    public void run() {
        while (true) {
            if (tick > 0) {
                System.out.println(Thread.currentThread().getName()
                        + "---sale--" + tick--);
            }
        }

    }

}

public class TicketDemo {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Tickect t1 = new Tickect();
        Tickect t2 = new Tickect();
        Tickect t3 = new Tickect();
        Tickect t4 = new Tickect();
        t1.start();
        t2.start();
        t3.start();
        t4.start();

    }

}
原文地址:https://www.cnblogs.com/sunxiaoyan/p/8543985.html