在java 虚拟机进程中,执行程序代码的任务是由线程来完成的,每个线程都有一个独立的程序计算器和方法调用栈(method invocation stack)
每当用java命令启动一个Java虚拟机进程是,Java虚拟机都会创建一个主程序,该程序从程序入口main()方法开始执行。
进程:应用程序的执行实例,有独立的内存空间和系统资源,
线程:cpu调度和分派的基本单位,进程中执行运算的最小单位,可完成一个独立的顺序控制流程
多线程:如果在一个进程中同时运行了多个线程,用来完成不同的工作,多个线程交替占用cpu资源,而非真正的执行
多线程的好处:
1.充分利用cpu的资源
2.简化编程模型
3.带来良好的用户体验
用户还可以创建自己的线程,它将和主线程并发运行,创建有两种方式:
继承Thread类
1.编写简单,可直接操作线程
2.适用于单继承
实现Runnable接口
1.避免单继承局限性
2.便于共享资源
Thread类
java提供了Java.lang.Thread类支持多线程编程
主线程
main()方法即为主线程入口
产生其他子线程的线程
必须最后完成执行,
因为它执行各种关闭动作
run()方法:包含线程运行时执行的代码
start()方法:用于启动线程
用户的线程类只需要继承Thread类 覆盖Thread类的run()方法即可
线程字段:
MNX_PRIORITY: 线程可以具有最高优先级
MIN_PRIORITY: 线程可以具有的最低优先级
NORM_PRIORITY: 分配给线程的默认优先级
void join(): 等待线程终止。
void run() : 如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。
void setName(String name) : 改变线程名称,使之与参数 name 相同。
void setPriority(int newPriority) : 更改线程的优先级。
static void sleep(long millis) : 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。
void start() : 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
static void yield() : 暂停当前正在执行的线程对象,并执行其他线程。
Boolean isAlive(): 测试线程是否处于活动状态
void interrrupt(): 中断线程
线程对象调用start()方法和调用run()方法的区别
run(): 只有主线程一条执行路径
start(): 多条执行路径,主线程和子线程并行交替执行
---继承Thread类创建线程
示例--
public class Hello extends Thread{
public void run()
{
for(int i=0;i<10;i++)
{
System.out.println(i+"."+"你好,来自线程"+Thread.currentThread().getName());
}
}
}
public class MyThread {
public static void main(String[] args) {
Hello thread1=new Hello();
thread1.start();
Hello thread2=new Hello();
thread2.start();
}
}
--实现Runnable接口创建线程
示例---
public class Hello implements Runnable{
@Override
public void run() {
for(int i=0;i<10;i++)
{
System.out.println(i+"."+"你好,来自线程"+Thread.currentThread().getName());
}
}
public class MyRunnable {
public static void main(String[] args) {
Hello hello=new Hello();
Thread thread1=new Thread(hello);
thread1.start();
Thread thread2=new Thread(hello);
thread2.start();
}
}
----线程的运行状态
--线程的休眠
示例--
public class ThreadDemo {
public void bySec(long s) {
for (int i = 1; i <=s; i++) {
System.out.println(i+"秒");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Wait {
public static void main(String[] args) {
ThreadDemo t=new ThreadDemo();
System.out.println("Wait");
t.bySec(5);
System.out.println("start");
}
}
---线程的强制运行
示例--
public class MyThread implements Runnable{
@Override
public void run() {
for(int i=1;i<=10;i++)
{
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"运行"+i);
}
}
}
public class ThreadJoinDemo {
public static void main(String[] args) {
System.out.println("线程强制执行");
Thread t=new Thread(new MyThread());
t.start();
for(int i=1;i<=10;i++) {
if(i==5) {
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+"运行"+i);
}
}
}
--线程的礼让
示例--
public class MyThread implements Runnable{
@Override
public void run() {
for(int i=1;i<=5;i++) {
System.out.println(Thread.currentThread().getName()+"正在运行"+i);
if(i==3) {
System.out.println("线程礼让");
Thread.yield();
}
}
}
}
public class ThreadYieldDemo {
public static void main(String[] args) {
Thread t1=new Thread(new MyThread(),"线程A");
Thread t2=new Thread(new MyThread(),"线程B");
t1.start();
t2.start();
}
}
线程的同步实现
示例--
public class Printer {
public synchronized void printer1()
{
System.out.print("j");
System.out.print("a");
System.out.print("v");
System.out.println("a");
}
public synchronized void printer2()
{
System.out.print("编");
System.out.println("程");
}
}
public class MyThread1 implements Runnable{
public Printer printer;
@Override
public void run() {
for(int i=1;i<=20;i++)
{
printer.printer1();
}
}
}
public class MyThread2 implements Runnable{
public Printer printer;
@Override
public void run() {
for(int i=1;i<=20;i++)
{
printer.printer2();
}
}
}
public class MyMain {
public static void main(String[] args) {
MyThread1 m1=new MyThread1();
Thread t1=new Thread(m1);
MyThread2 m2=new MyThread2();
Thread t2=new Thread(m2);
Printer printer=new Printer();
m1.printer=printer;
m2.printer=printer;
t1.start();
t2.start();
}
}
通过在方法声明中加入synchronized关键词来声明同步方法
访问修饰符 synchronized 返回类型 方法名 (参数类型){//方法体}
或者
synchronized 访问修饰符 返回类型 方法名 (参数类型){//方法体}