基本概念
进程:有独立的内存空间,进程中的数据存放空间(堆空间和栈空间)是独立的,至少有一个线程。
线程:堆空间是共享的,栈空间是独立的,线程消耗的资源也比进程小,相互之间可以影响的,又称为轻型进程或进程元。
一.线程建立
import java.io.IOException;
/**
* @Auther: guguda
* @Date: 2019/4/18 15:34
* @Description:
*/
//在java中开启进程:
public class ProcessDemo {
public static void main(String[] args) throws IOException {
//方法一:使用Runtime类的exec()方法
Runtime rt = Runtime.getRuntime();
rt.exec("notepad");
//方法二:ProcessBuilder的start()方法
ProcessBuilder pb = new ProcessBuilder("");
pb.start();
}
}
二.进程建立
package com.threaddemo;
/**guguda
* @Auther: Administrator
* @Date: 2019/4/18 15:46
* @Description:
*/
public class ThreadDemo {
public static void main(String[] args) {
download();
}
public static void download(){
for (int i = 0; i <= 100; i++) {
System.out.println("正在下载..."+i+"%");
}
}
public static void play(){
for (int i = 0; i <= 100; i++) {
System.out.println("正在播放..."+i+"%");
}
}
}
三.多线程的建立
方式1:继承Thread类;
方式2:实现Runnable接口;
线程类(java.lang.Thread): Thread类和Thread的子类才能称之为线程类. 阅读API.
别忘了主线程(mainf方法运行,表示主线程).
方式1:继承Thread类:
步骤:
1):定义一个类A继承于java.lang.Thread类.
2):在A类中覆盖Thread类中的run方法.
3):我们在run方法中编写需要执行的操作---->run方法里的,线程执行体.
4):在main方法(线程)中,创建线程对象,并启动线程.
创建线程类对象: A类 a = new A类();
调用线程对象的start方法: a.start();//启动一个线程
注意:千万不要调用run方法,如果调用run方法好比是对象调用方法,依然还是只有一个线程,并没有开启新的线程.
代码演示
package com.threaddemo;
/**
* @Auther: guguda
* @Date: 2019/4/18 16:14
* @Description:
*/
public class ThreadmannyDemo {
public static void main(String[] args) {
play play = new play();
download download = new download();
//这里不能写成run
play.start();
download.start();
}
}
class play extends Thread{
@Override
public void run() {
for(int i=0;i<1000;i++){
System.out.println("正在播放..."+i+"%");
}
}
}
class download extends Thread{
@Override
public void run() {
for(int i=0;i<1000;i++){
System.out.println("正在下载..."+i+"%");
}
}
}
方式2:实现Runnable接口
步骤:
1):定义一个类A实现于java.lang.Runnable接口,注意A类不是线程类.
2):在A类中覆盖Runnable接口中的run方法.
3):我们在run方法中编写需要执行的操作---->run方法里的,线程执行体.
4):在main方法(线程)中,创建线程对象,并启动线程.
创建线程类对象: Thread t = new Thread(new A());
调用线程对象的start方法: t.start();
代码演示
/**
* @Auther: guguda
* @Date: 2019/4/18 16:26
* @Description:
*/
public class RunnableDemo {
public static void main(String[] args) {
Download1 download = new Download1();
play1 play = new play1();
Thread thread1 = new Thread(download);
Thread thread2= new Thread(play);
thread1.start();
thread2.start();
}
}
class Download1 implements Runnable{
@Override
public void run() {
for (int i = 0; i <= 100; i++) {
System.out.println("正在下载..."+i+"%");
}
}
}
class play1 implements Runnable{
@Override
public void run() {
for (int i = 0; i <= 100; i++) {
System.out.println("正在播放..."+i+"%");
}
}
}
方式3:匿名内部类来创建线程
只适用于某个类只能用一次的情况
/**
* @Auther: guguda
* @Date: 2019/4/18 20:05
* @Description:
*/
public class AnnounceThreadDemo {
public static void main(String[] args) {
for(int i=0;i<=100;i++){
System.out.println("正在下载..."+i+"%");
if(i==10){
new Thread(new Runnable() {
@Override
public void run() {
for(int j=0;j<=100;j++){
System.out.println("正在播放..."+j+"%");
}
}
}).start();
}
}
}
}
不要忘记,我们的main()方法也是一个线程,所以我们同样可以在main方法中模拟一个线程,先下载10次,当10后,我们启动播放的线程,再让程序双线程交替执行。同样,还可以使用Thread类来创建
方式四:用Thread类实现多线程
public class MainThreadDemo {
public static void main(String[] args) {
for(int i=0;i<=100;i++){
System.out.println("正在下载..."+i);
if(i==10){
new Thread(){
@Override
public void run() {
for(int j=0;j<=100;j++){
System.out.println("正在播放..."+j);
}
}
}.start();
}
}
}
}