进程是正在运行的程序;
线程是进程中单个顺序控制流,是一条执行路径。
如果一个进程有多跳执行路径,则是多线程;如果只有一条则是单线程。
要实现多线程,可使一个类继承自Thread类,并重写run方法。(start()会开一个新栈)
Java中线程是抢占式的,也就是线程争夺cpu的执行权,cpu才是老大!
步骤包括:
1.先创建一个新类m,使之继承Thread;
2.重写run方法;
3。new 一个m类的对象t;
4.启动线程:t.start();
下面为一简单示例:
public class Main {
public static void main(String[] args) {
T t=new T();
t.start();
for(int i=0;i<20;i++)
{
System.out.println("Main--->"+i);
}
}
}
public class T extends Thread{
public void run(){
for(int i=0;i<20;i++)
{
System.out.println("T--->"+i);
}
}
}
运行结果:
Main--->0
T--->0
Main--->1
T--->1
Main--->2
T--->2
Main--->3
T--->3
Main--->4
T--->4
Main--->5
T--->5
Main--->6
Main--->7
Main--->8
T--->6
T--->7
T--->8
T--->9
T--->10
T--->11
T--->12
T--->13
T--->14
T--->15
Main--->9
T--->16
T--->17
T--->18
T--->19
Main--->10
Main--->11
Main--->12
Main--->13
Main--->14
Main--->15
Main--->16
Main--->17
Main--->18
Main--->19
线程中有许多控制方法:
比如join()和sleep();由帮助文档知:
final void
join()
Waits for this thread to terminate.
static void
sleep(long millis)
Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds, subject to the precision and accuracy of system timers and schedulers.
sleep方法是当前线程停留millis毫秒;join是等待这个线程死亡,阻止其他线程执行,必须等他先执行完。
sleep:
class T extends Thread{
public void run(){
for(int i=0;i<10;i++)
{
System.out.println(Thread.currentThread()+"T--->"+i);
}
}
}
public class Main {
public static void main(String[] args) throws InterruptedException {
T t=new T();
T t1=new T();
t.start();
t1.start();
for(int i=0;i<10;i++){
System.out.println(Thread.currentThread()+"Main--->"+i);
}
T.sleep(100);
}
}
Thread[main,5,main]Main--->0
Thread[main,5,main]Main--->1
Thread[main,5,main]Main--->2
Thread[main,5,main]Main--->3
Thread[main,5,main]Main--->4
Thread[main,5,main]Main--->5
Thread[main,5,main]Main--->6
Thread[main,5,main]Main--->7
Thread[Thread-0,5,main]T--->0
Thread[main,5,main]Main--->8
Thread[Thread-1,5,main]T--->0
Thread[main,5,main]Main--->9
Thread[Thread-0,5,main]T--->1
Thread[Thread-1,5,main]T--->1
Thread[Thread-0,5,main]T--->2
Thread[Thread-1,5,main]T--->2
Thread[Thread-0,5,main]T--->3
Thread[Thread-1,5,main]T--->3
Thread[Thread-0,5,main]T--->4
Thread[Thread-1,5,main]T--->4
Thread[Thread-0,5,main]T--->5
Thread[Thread-1,5,main]T--->5
Thread[Thread-0,5,main]T--->6
Thread[Thread-1,5,main]T--->6
Thread[Thread-1,5,main]T--->7
Thread[Thread-1,5,main]T--->8
Thread[Thread-1,5,main]T--->9
Thread[Thread-0,5,main]T--->7
Thread[Thread-0,5,main]T--->8
Thread[Thread-0,5,main]T--->9
Process finished with exit code 0
join:
// Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`,
// then press Enter. You can now see whitespace characters in your code.
public class Main {
public static void main(String[] args) throws InterruptedException {
T t=new T();
T t1=new T();
t.start();
t1.start();
for(int i=0;i<10;i++){
System.out.println(Thread.currentThread()+"Main--->"+i);
}
t.join();
}
}
class T extends Thread{
public void run(){
for(int i=0;i<10;i++)
{
System.out.println(Thread.currentThread()+"T--->"+i);
}
}
}
2
Thread[main,5,main]Main--->0
Thread[Thread-0,5,main]T--->0
Thread[main,5,main]Main--->1
Thread[Thread-1,5,main]T--->0
Thread[Thread-1,5,main]T--->1
Thread[Thread-1,5,main]T--->2
Thread[Thread-1,5,main]T--->3
Thread[Thread-0,5,main]T--->1
Thread[Thread-0,5,main]T--->2
Thread[Thread-0,5,main]T--->3
Thread[Thread-0,5,main]T--->4
Thread[Thread-0,5,main]T--->5
Thread[Thread-0,5,main]T--->6
Thread[Thread-0,5,main]T--->7
Thread[Thread-0,5,main]T--->8
Thread[Thread-0,5,main]T--->9
Thread[Thread-1,5,main]T--->4
Thread[Thread-1,5,main]T--->5
Thread[Thread-1,5,main]T--->6
Thread[Thread-1,5,main]T--->7
Thread[Thread-1,5,main]T--->8
Thread[Thread-1,5,main]T--->9
Thread[main,5,main]Main--->2
Thread[main,5,main]Main--->3
Thread[main,5,main]Main--->4
Thread[main,5,main]Main--->5
Thread[main,5,main]Main--->6
Thread[main,5,main]Main--->7
Thread[main,5,main]Main--->8
Thread[main,5,main]Main--->9