- 线程是进程中的内容
- 每个程序中都必须有线程,因为线程是程序中的控制单元
- 进程:是一个正在执行中的程序,每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元
- 线程:就是进程中一个独立的控制单元,线程在控制着进程的执行
- 一个进程中至少有一个线程
- 命令行编译java:
Cd是进入子目录,首先是javac 编译成为.class文件,之后在运行java
- java VM(java虚拟机)启动的时候就会有一个进程java.exe,该进程中至少有一个线程负责java程序的执行,并且这个线程运行的代码存在于main方法中,该线程称之为主线程
- 扩展:更细节说明jvm,jvm启动不止一个线程,还有负责垃圾回收机制的线程
- 通过对api的查找,Java.lang 中的类Thread 创建线程
第一种创建线程的方式:继承Thread类,复写run方法(目的:将自定义的代码存储在run方法中,让线程运行),调用线程的start方法,该方法有两个作用:(1)启用线程(2)调用run方法
- 双核CPU :好多程序可以同时跑起来,更快。
- 发现运行结果每一次都不同:因为多个线程都在获取CPU的执行权,cpu执行到谁,谁就运行。明确一点,在某一个时刻,只能有一个程序在运行(多核除外)
- CPU在做着快速的切换,以达到看上去相同运行的效果。我们可以形象的把多线程的运行行为在互相抢夺cpu的执行权,这就是多线程的一个特性:随机性,谁抢到谁执行,至于执行多长时间,cpu说的算
- 为什么覆盖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()或者构造函数