并行和并发
并发:指在某一个时间点同时运行多个程序
并行:指在某一个时间内同时运行多个程序
JVM虚拟机的启动时多线程的。
原因垃圾回收线程也要先启动,否则很容易出现内存溢出
现在垃圾回收线程加上前面的主线程,最低启动两个线程。
========================================
需求:我们要实现多线程的程序
如何实现呢?
由于线程是依赖进程而存在的,所以我们应该先创建一个进程出来。
而进程是由系统创建的,所以我们应该去掉用系统功能创建一个进程。
Java时不能直接调用系统功能的,所以我们没办法直接实现多线程程序。
但是呢?Java可以去调用C/C++写好的程序来实现多线程程序。
由C/C++去调用系统功能创建进程,然后由Java去调用这样的东西。
然后提供一些类供我们使用,我们就可以实现多线程程序了
那么Java提供的类是什么呢?
Thread
通过查看API,我们知道了两种方式实现多线程程序。
方式1:
继承Thread类
步骤:A:自定义MyThread继承Thread类;
B:MyThread类里面重写run();
为什么重写呢?
因为,不是类中所有的代码都需要多线程执行的。为了区别哪些代码能够被线程执行,java提供了Thread类中 的run()用来包含那些被线程执行的代码。
C:创建对象;
D:启动线程;
package cn.itcast_02;
public class ThreadDemo2 {
public static void main(String[] args) {
//调用run()方法为什么是单线程呢?
//直接调用就相当于普通单线程方法,
//想看到多线程的效果,必须配合start()
// //方式一
// MyThread myth1 = new MyThread();
// MyThread myth2 = new MyThread();
// //无参构造+setXxx();
// myth1.setName("g");
// myth2.setName("w");
// myth1.start();
// myth2.start();
// //myth.start();
MyThread myth1 = new MyThread("g");
MyThread myth2 = new MyThread("w");
myth1.start();
myth2.start();
// //返回当前线程的名称
// String name = Thread.currentThread().getName();
// System.out.println(name);
}
}
package cn.itcast_02;
/*
* 该类重写run()方法,为什么?
*
* 不是类中所有的代码都需要多线程执行的,
* 为了区别哪些代码能够被线程执行,java提供了Thread类中的run()用来包含那些被线程执行的代码。
*
* Thread类的
* 得到线程名称:
* getName()方法 可以得到线程的名字。
* 设置线程名称:
* setName(String name)方法 可以设置线程名称。
*
*
*/
import java.security.AccessControlContext;
import java.security.AccessController;
public class MyThread extends Thread {
public MyThread(String name) {
super(name);
}
@Override
public void run() {
//自己写执行的代码
//System.out.println("好好学习");
//一般来说,被线程执行的代码肯定是比较耗时的。
for(int x=0;x<100;x++) {
System.out.println(getName()+":"+ x);
}
}
}
/*
* public Thread() {
private volatile String name;
init(null, null, "Thread-" + nextThreadNum(), 0);
}
private void init(ThreadGroup g, Runnable target, String name,
long stackSize) {
init(g, target, name, stackSize, null, true);
}
private void init(ThreadGroup g, Runnable target, String name,
long stackSize, AccessControlContext acc,
boolean inheritThreadLocals) {
if (name == null) {
throw new NullPointerException("name cannot be null");
}
this.name = name;
}
private static int threadInitNumber; 0,1,2
private static synchronized int nextThreadNum() {
return threadInitNumber++;0,1
}
public final String getName() {
return name;
}
*/
run()和start()方法的区别:
run():仅仅是封装了被线程执行的代码,直接调用时普通方法
start():首先启动了线程,然后再由jvm去调用该线程的run()方法
======================================================
注意
线程的默认优先级是5;
优先级范围是0-10;
线程的优先级高表示线程获取的CPU时间片的几率高,但是要再次数比较多,或者多次运行的时候
才能看出效果;
package cn.itcast_03;
public class ThreadPriorityDemo {
public static void main(String[] args) {
ThreadPriority tp1 = new ThreadPriority();
ThreadPriority tp2 = new ThreadPriority();
ThreadPriority tp3 = new ThreadPriority();
tp1.setName("gao");
tp2.setName("li");
tp3.setName("zhang");
//IllegalArgumentException 非法参数异常
//抛出的异常表明向方法传递了一个不合法的参数
// 优先级[MAX_PRIORITY,MAX_PRIORITY]=[0,10]
//NORM_PRIORITY = 5
tp1.setPriority(10);
tp2.setPriority(5);
tp3.setPriority(1);
//
// System.out.println(tp1.getPriority());
// System.out.println(tp2.getPriority());
// System.out.println(tp3.getPriority());
//
tp1.start();
tp2.start();
tp3.start();
}
}
package cn.itcast_03;
public class ThreadPriority extends Thread {
@Override
public void run() {
for(int x=0;x<1000;x++) {
System.out.println(getName()+":"+x);
}
}
}
==========================================
==============================线程休眠:
package cn.itcast_04;
import java.util.Date;
public class ThreadSleep extends Thread {
@Override
public void run() {
for(int x=0;x<1000;x++) {
System.out.println(getName()+":"+x+",日期:"+ new Date());
//
//困了,我稍微休息一秒钟
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
package cn.itcast_04;
import cn.itcast_04.ThreadSleep;
public class ThreadSleepDemo {
public static void main(String[] args) {
ThreadSleep ts1 = new ThreadSleep();
ThreadSleep ts2 = new ThreadSleep();
ThreadSleep ts3 = new ThreadSleep();
ts1.setName("gao");
ts2.setName("li");
ts3.setName("zhang");
ts1.start();
ts2.start();
ts3.start();
}
}
======================================
线程加入:
==================================
线程礼让:
后台线程:
中断线程: