Java基础-多线程Thread和Runnable

素颜马尾好姑娘i 2022-01-22 07:19 408阅读 0赞

1、多线程实现对多个任务进行控制

1)其中一个类Eat

public class Eat extends Thread{
public void run(){
for(int i =0;i<2;i++){
try {
Thread.sleep(1000);
System.out.println(“ eat “);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

}

2)另一个类Music

public class Music extends Thread{
public void run(){
for(int i =0;i<2;i++){
try {
Thread.sleep(1000);
System.out.println(“ music “);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

3)多线程并发执行

public static void main(String[] args) {

  1. Music muT = new Music();
  2. Eat eatT = new Eat();
  3. muT.start();
  4. eatT.start();
  5. \}

2、继承Thread类

public class TestThread extends Thread{

  1. /\*\*
  2. \* @param ycy
  3. \*/
  4. private String ttName;
  5. private int shushu = 1;
  6. public TestThread(String ttName) \{
  7. super();
  8. this.ttName = ttName;
  9. \}
  10. @Override
  11. public void run() \{
  12. // TODO Auto-generated method stub
  13. while(shushu<=10)\{
  14. System.out.println(ttName+" 对应的数为: "+shushu+"; ");
  15. shushu++;
  16. \}
  17. \}
  18. //并发进行两个进程,每个人都数数10;
  19. public static void main(String\[\] args) \{
  20. // TODO Auto-generated method stub
  21. TestThread tt1 = new TestThread("1号线程");
  22. TestThread tt2 = new TestThread("2号线程");
  23. tt1.start();
  24. tt2.start();
  25. \}

}

3、Runnable

public class TestRun implements Runnable {

  1. /\*\*
  2. \* @param args
  3. \*/
  4. private String ttName;
  5. private int shushu = 1;
  6. public TestRun(String ttName) \{
  7. super();
  8. this.ttName = ttName;
  9. \}
  10. public void run() \{
  11. // TODO Auto-generated method stub
  12. while(shushu<=10)\{
  13. System.out.println(ttName+" 对应的数数1为: "+shushu+"; ");
  14. shushu++;
  15. \}
  16. \}
  17. //并发进行两个进程,每个人都数数10;
  18. public static void main(String\[\] args) \{
  19. // TODO Auto-generated method stub
  20. TestRun tr1 = new TestRun("一号线程");
  21. TestRun tr2 = new TestRun("二号线程");
  22. Thread t11 = new Thread(tr1);
  23. Thread t22 = new Thread(tr2);
  24. t11.start();
  25. t22.start();
  26. \}

}

4、多个线程同步

public class TestRun implements Runnable {

  1. /\*\*
  2. \* @param args
  3. \*/
  4. private String ttName;
  5. private int shushu = 1;
  6. public TestRun(String ttName) \{
  7. super();
  8. this.ttName = ttName;
  9. \}
  10. public synchronized void run() \{//synchronized线程同步,如果不加,出现重复和混乱数据
  11. // TODO Auto-generated method stub
  12. while(shushu<=10)\{
  13. System.out.println(ttName+" 对应的数数1为: "+shushu+"; ");
  14. shushu++;
  15. \}
  16. \}
  17. //并发进行两个进程,每个人都数数10;
  18. public static void main(String\[\] args) \{
  19. TestRun tr3 = new TestRun("超级线程2");
  20. Thread t1 = new Thread(tr3);
  21. Thread t2 = new Thread(tr3);
  22. Thread t3 = new Thread(tr3);
  23. t1.start();
  24. t2.start();
  25. t3.start();
  26. \}

}

两种方式的区别和联系

1)Runnable相对优势:

  • java的单继承,当继承了Thread类,则不能继承其他类,而实现Runnable接口可以
  • 实现Runnable接口的线程类的多个线程,可以访问同一变量,而Thread则不能(多窗口买票问题)

原因:两种方式启动方式不同:

  • Runnable线程类是实例化一个对象o之后,通过多次new Thread(o).start();启动多个线程,而这几个线程属于一个对象,对象的成员变量是同一个。
  • Thread线程类启动多个线程需要 new MyThread().start();每个线程启动都对应多个对象,他们的成员变量是独立的。

2)Thread优势

1、使用线程的方法方便一些,例如:获取线程的Id(Thread.currentThread().getId())、线程名(Thread.currentThread().getName())、线程状态(Thread.currentThread().getState())等

2、操作同一变量,但是线程调用run方法内容不同时,使用Thread内部类的方式进行,例如生产者、消费者模式

扫码关注一起随时随地学习!!!就在洋葱攻城狮,更多精彩,等你来!!

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3ljeTA3MDY_size_16_color_FFFFFF_t_70

发表评论

表情:
评论列表 (有 0 条评论,408人围观)

还没有评论,来说两句吧...

相关阅读

    相关 线】——Thread VS Runnable

    进程和线程的关系     多个线程构成一个进程,线程是进程中的一个元素,例如QQ.exe查看电脑进程的时候发现只有一个进程,但是我们可以同时和多个用户聊天交流,而且可以一