进程 :是正在进行的应用程序
线程:是进程中的单个顺序执行流,是一条执行路径
public class MyThreaddemo {
public static void main(String[] args) {
MyThread mt1 = new MyThread();
MyThread mt2 = new MyThread();
//mt1.run(),mt2.run()
//void start()导致该线程开始执行,java虚拟机调用此线程的run方法
mt1.start();
mt2.start();
}
}
public class MyThread extends Thread{
@Override
public void run() {
for (int i=0;i<100;i++){
System.out.println(i);
}
}
}
多线程的实现方式
1.继承Thread类
为什么要重写run方法?
因为run()方法是用来封装被线程执行的代码
run()方法和start()方法的区别?
run(): 封装线程执行的代码,直接调用,相当与普通方法的调用
start(): 启动线程,然后由JVM调用此线程的run方法
设置和获取线程名称
public class MyThreaddemo {
public static void main(String[] args) {
MyThread mt1 = new MyThread("高铁");
MyThread mt2 = new MyThread("飞机");
//void setName(String name):将此线程的名称更改为等于参数name
// mt1.setName("飞机");
// mt2.setName("高铁");
mt1.start();
mt2.start();
//static Thread currentThread() 返回对当前正在执行的线程对象的引用
// System.out.println(Thread.currentThread().getName());
}
}
public class MyThread extends Thread{
public MyThread(String name){
super(name);
}
@Override
public void run() {
for (int i=0;i<100;i++){
System.out.println(getname()+","+i);
}
}
}
设置线程优先级
public static void main(String[] args) {
ThreadPriority mt1 = new ThreadPriority();
ThreadPriority mt2 = new ThreadPriority();
//void setName(String name):将此线程的名称更改为等于参数name
mt1.setName("飞机");
mt2.setName("高铁");
//设置优先级
mt1.setPriority(6);
mt2.setPriority(10);
mt1.start();
mt2.start();
}
}
线程控制
sleep:使当前正在执行的线程停留几毫秒
join:等待这个线程死亡
setDaemon:守护线程,当运行的都是守护线程,java虚退出
sleep:
public class ThreadSleepdemo {
public static void main(String[] args) {
ThreadSleep ts1 = new ThreadSleep();
ThreadSleep ts2 = new ThreadSleep();
ThreadSleep ts3 = new ThreadSleep();
ts1.setName("刘备");
ts2.setName("曹操");
ts3.setName("孙权");
ts1.start();
ts2.start();
ts3.start();
}
}
public class ThreadSleep extends Thread{
@Override
public void run() {
for (int i=0;i<100;i++){
System.out.println(getName()+","+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
join:
public class ThreadJoindemo{
public static void main(String[] args) throws InterruptedException {
ThreadJoin tj1 = new ThreadJoin();
ThreadJoin tj2 = new ThreadJoin();
ThreadJoin tj3 = new ThreadJoin();
tj1.setName("康熙");
tj2.setName("四阿哥");
tj3.setName("八阿哥");
tj1.start();
tj1.join();
tj2.start();
tj3.start();
public class ThreadJoin extends Thread{
@Override
public void run() {
for (int i=0;i<100;i++){
System.out.println(getName()+","+i);
}
}
}
}
}
daemon:
public class ThreadJoindemo{
public static void main(String[] args) throws InterruptedException {
ThreadDeamon tj2 = new ThreadDeamon();
ThreadDeamon tj3 = new ThreadDeamon();
tj2.setName("张飞");
tj3.setName("关羽");
//设置主线程为刘备
Thread.currentThread().setName("刘备");
//设置守护线程
tj2.setDaemon(true);
tj3.setDaemon(true);
tj2.start();
tj3.start();
for (int i=0;i<10;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}
public class ThreadDeamon extends Thread{
@Override
public void run() {
for (int i=0;i<100;i++){
System.out.println(getName()+","+i);
}
}
}
多线程的实现方式
2.实现Runanble接口
public class MyRunabledemo {
public static void main(String[] args) {
//创建MyRunable类的对象
MyRunable mr = new MyRunable();
//创建Thread类的对象,把MyRunable的对象作为构造方法参数
Thread t1 = new Thread(mr,"飞机");
Thread t2 = new Thread(mr,"高铁");
//启动线程
t1.start();
t2.start();
}
}
public class MyRunable implements Runnable{
@Override
public void run() {
for (int i=0;i<100;i++){
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
}