JAVA多线程基础-建立和使用

1.线程的建立 需继承Thread,并重写run方法java

public class MyThread extends Thread {
    @Override
    public void run() {
        for (int i=0;i<100;i++){
            if(i%2==0){
                System.out.println(i);
            }
        }
    }
}

2.线程的使用ide

实例化,并调用Start()方法测试

获取当前线程名称的方法:this

Thread.currentThread().getName()
public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();
        System.out.println("hello");
    }

3. 问题1 ,不能直接调用run()方法启动线程线程

    直接调用run方法不会启用线程,会在调用run方法的线程内执行code

4.问题2 ,线程实例不能再次start 会报 IllegalThreadStateException异常对象

    能够再实例化一个线程对象。继承

5.练习生命周期

/*
* 练习:建立两个分线程,1 遍历100内偶数 2 遍历100内奇数
* */
public class ThreadDemo {
    public static void main(String[] args) {
        //1.建立对象方式
/*        MyThread1 myThread1 = new MyThread1();
        MyThread2 myThread2 = new MyThread2();
        myThread1.start();
        myThread2.start();*/
        //2.建立Thread类的匿名子类方式
        new Thread(){
            @Override
            public void run() {
                for (int i = 0; i < 100; i++) {
                    if(i%2==0){
                        System.out.println(Thread.currentThread().getName()+" :  "+ i);
                    }
                }
            }
        }.start();
        new Thread(){
            @Override
            public void run() {
                for (int i = 0; i < 100; i++) {
                    if(i%2!=0){
                        System.out.println(Thread.currentThread().getName()+" : " +i);
                    }
                }
            }
        }.start();

    }

}
class MyThread1 extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if(i%2==0){
                System.out.println(Thread.currentThread().getName()+" :  "+ i);
            }
        }
    }
}
class MyThread2 extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if(i%2!=0){
                System.out.println(Thread.currentThread().getName()+" : " +i);
            }
        }
    }
}

6. Thread 的经常使用方法队列

  • void start() :启动线程,并执行对象的run()方法
  • run();             线程在被调度时执行的操做
  • String getName()                         返回线程的名称
  • void setName(String name) :     设置该线程的名称
  • static Thread currentThread(): 返回当前线程。在Thead子类中就是this ,一般用于主线程和Runable实现类
  • static void yied():线程让步
    • 暂停当前正在执行的线程,把执行机会让给优先级相同或更高的线程
    • 若队列中没有同优先级的线程,忽略此方法
  • join() 当某个程序执行流中调用其余线程的join()方法时,调用线程将被阻塞,直到join()方法加入的join线程执行完毕为止
    • 低优先级的线程也能够得到执行
  • static void sleep(long millis): 指定时间:毫秒
    • 令当前活动线程在指定时间段内放弃对CPU控制,使其余线程有机会被执行,时间到后重排队。
    • 抛出InterruptedException异常
  • stop() 强制线程生命期结束,不推荐使用
  • boolean isAlive(): 返回boolean 判断线程是否还活着
package com.zhanghl.service;

/*
* 测试Thread类中的经常使用方法:
* 1.start() :启动线程,并执行对象的run()方法
* 2.run(): 一般须要重写Thread类中的此方法,将建立的线程要执行的操做声明再此方法中
* 3.currentThread(): 返回当前代码执行的线程,静态方法
* 4.getName():获取当前线程的方法
* 5.setName(): 设置当前线程的方法
* 6.yield() 线程让步
* 7.join() 在线程A中调用线程B的join(),此时线程A进入阻塞状态,
*           直到线程B彻底执行完之后,线程A才会结束阻塞状态
* 8.stop() 强制线程生命周期中止。不推荐使用,已过期
* 9.sleep(long millitime) 让当前线程睡眠指定的millitime毫秒,在指定的millitime毫秒时间内,当前线程时阻塞装
* 10. isAlive() 判断当前线程是否存活
* */
public class ThreadMethodTest {
    public static void main(String[] args) {
        /*构造器方式命名*/
        HelloThread h1 = new HelloThread("线程1");
        //h1.setName("线程一");
        h1.start();
        /*给主线程命名*/
        Thread.currentThread().setName("主线程");
        for (int i = 0; i < 100; i++) {
            if(i%2==0){
                System.out.println(Thread.currentThread().getName()+" :  "+ i);
            }
            /*当i==20时 让子线程 h1 先执行 ,执行完毕再回到主线程*/
            if (i==20){
                try {
                    h1.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        System.out.println("h1.isAlive()"+h1.isAlive());
    }

}
class HelloThread extends Thread{
    @Override
    public void run() {

        for (int i = 0; i < 100; i++) {
            if(i%2!=0){
                try {
                    //睡眠1秒
                    sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+" :  "+ i);
            }
            /*yield释放执行权*/
            /*if(i%10==0){
                this.yield();
            }*/
        }

    }
    public HelloThread(){}
    /*利用Thread 类中 使用名称实例化的方法*/
    public HelloThread(String name){
        super(name);
    }
}
相关文章
相关标签/搜索