并行和并发
并发:指在某一个时间点同时运行多个程序
并行:指在某一个时间内同时运行多个程序
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(); } }
======================================
线程加入:
==================================
线程礼让:
后台线程:
中断线程: