/**
* java 多线程
* 应用程序:可运行的程序
* 进程:进程正在进行的程序,线程的集合,执行的程序,在进程中一定有个线程是主线程
* 线程:可以这样说是一个执行顺序
* 使用多线程提高效率,每个线程都不相互影响,因为是独立运行的
* 多线程的应用场景:多线程下载,爬虫,ajax异步上传 ,分布式job(同一时间执行多个任务调度)
*
* @author Administrator
* @date 2018/1/24 0024
*/
/**
* 定义继承Thread类的子类
*/
class fristThread extends Thread {
/**
* 这里的run方法就是线程需要执行的任务或执行的代码
*/
@Override
public void run() {
for (int i = 0; i < 5; i++) {
try{
Thread.sleep(1000);
}catch (Exception e){
e.getMessage();
}
System.out.println("线程的id"+ getId()+"run" + i +"子线程的名称"+getName());
}
}
}
/**
* 使用runnable 接口方式
*/
class secondThread implements Runnable{
@Override
public void run() {
for (int m = 0; m < 30; m++) {
System.out.println("子线程run"+m);
}
}
}
public class Process {
/**
* 1:使用Thread类方式
* 2:使用runnable 接口方式
* 3:使用匿名内部类的方式
* 4:callable
*/
public static void main(String[] args) {
/**
* 怎样调用线程
*/
fristThread fristThread = new fristThread();
secondThread secondThread = new secondThread();
/**
* 启动线程,不是调用run方法,而是使用start方法,系统会把run()方法当成线程执行体来处理
* 开启多线程,代码不会从上向下执行
* 同步:代码从上到下执行(单线程)
* 异步:多线程,代码不会从上向下执行
*
*/
fristThread.start();
//runnable 是接口,没有start方法
Thread thread = new Thread(secondThread);
thread.start();
/*主线程*/
System.out.println("主线程的id"+Thread.currentThread().getId()+"主线程的名称"+Thread.currentThread().getName());
for (int j = 0; j < 30; j++) {
System.out.println("main线程"+j);
}
}
}
/**
* 守护线程:和main相关
* 用户线程:用户自己创建的线程,若主线程停止掉,不会影响用户线程
* gc线程:也属于守护线程,和主线程一起销毁
* @author Administrator
* @date 2018/1/24 0024
*/
public class Test01 {
public static void main(String[] args) {
/**
* 使用匿名内部类的方式实现
*/
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("子线程i" + i);
}
}
});
/*该线程为守护线程,和主线程一块销毁*/
/* thread.setDaemon(true);*/
thread.start();
for (int i = 0; i <5 ; i++) {
System.out.println("主线程i"+i);
}
System.out.println("主线程加载完毕。。。。。。。");
}
}