加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java多线程基础(一)

发布时间:2020-12-14 06:33:48 所属栏目:Java 来源:网络整理
导读:1.什么是进程、线程 2.创建线程的方式(三种) 1. 采用实现 Runnable、Callable 接口的方式创建多线程时,线程类只是实现了 Runnable 接口或 Callable 接口,还可以继承其他类。 2. 使用继承 Thread 类的方式创建多线程时,编写简单,如果需要访问当前线程,

1.什么是进程、线程

2.创建线程的方式(三种)

  • 1. 采用实现 Runnable、Callable 接口的方式创建多线程时,线程类只是实现了 Runnable 接口或 Callable 接口,还可以继承其他类。

  • 2. 使用继承 Thread 类的方式创建多线程时,编写简单,如果需要访问当前线程,则无需使用 Thread.currentThread() 方法,直接使用 this 即可获得当前线程。

3.线程的状态及特性

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; main(String[] args) { </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated method stub</span> MyThread myThread=<span style="color: #0000ff;"&gt;new</span> MyThread("name"<span style="color: #000000;"&gt;); </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;myThread.run();</span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;主线程</span> myThread.start();<span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;多线程</span>

<span style="color: #000000;"> }

}
<span style="color: #0000ff;">class MyThread <span style="color: #0000ff;">extends<span style="color: #000000;"> Thread{

</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; MyThread() {
    </span><span style="color: #0000ff;"&gt;super</span><span style="color: #000000;"&gt;();
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated constructor stub</span>

<span style="color: #000000;"> }
<span style="color: #0000ff;">public<span style="color: #000000;"> MyThread(String name) {
<span style="color: #0000ff;">super<span style="color: #000000;">(name);
}

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; run() {
    </span><span style="color: #0000ff;"&gt;for</span>(<span style="color: #0000ff;"&gt;int</span> i=0;i<20;i++<span style="color: #000000;"&gt;) {
        System.out.println(Thread.currentThread().getName()</span>+"→"+<span style="color: #000000;"&gt;i);
    }
}

}

创建线程,输出1~100之间的偶数。要求使用线程实现,继承Thread类

<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> ThreadDemo2 {

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; main(String[] args) {
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated method stub</span>
    OutputEven outputEven=<span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; OutputEven();
    outputEven.start();
}

}
<span style="color: #0000ff;">class OutputEven <span style="color: #0000ff;">extends<span style="color: #000000;"> Thread{

@Override
</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; run() {
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated method stub</span>
    <span style="color: #0000ff;"&gt;for</span>(<span style="color: #0000ff;"&gt;int</span> i=1;i<=100;i++<span style="color: #000000;"&gt;) {
        </span><span style="color: #0000ff;"&gt;if</span>(i%2==0<span style="color: #000000;"&gt;) {
            System.out.println(Thread.currentThread().getName()</span>+"→"+<span style="color: #000000;"&gt;i);
        }
    }
}

}

?使用线程模拟四个工人搬砖场景,谁抢到托运机谁去搬砖

<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> ThreadDemo3 {

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; main(String[] args) {
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated method stub</span>
    Worker worker1=<span style="color: #0000ff;"&gt;new</span> Worker("张三1","搬砖"<span style="color: #000000;"&gt;);
    Worker worker2</span>=<span style="color: #0000ff;"&gt;new</span> Worker("张三2","搬砖"<span style="color: #000000;"&gt;);
    Worker worker3</span>=<span style="color: #0000ff;"&gt;new</span> Worker("张三3","搬砖"<span style="color: #000000;"&gt;);
    Worker worker4</span>=<span style="color: #0000ff;"&gt;new</span> Worker("张三4","搬砖"<span style="color: #000000;"&gt;);
    worker1.start();
    worker2.start();
    worker3.start();
    worker4.start();

}

}
<span style="color: #0000ff;">class Worker <span style="color: #0000ff;">extends<span style="color: #000000;"> Thread{
String name;
String task;

</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; Worker() {
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated constructor stub</span>
    <span style="color: #0000ff;"&gt;super</span><span style="color: #000000;"&gt;();
}

</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; Worker(String name,String task) {
    </span><span style="color: #0000ff;"&gt;super</span><span style="color: #000000;"&gt;();
    </span><span style="color: #0000ff;"&gt;this</span>.name =<span style="color: #000000;"&gt; name;
    </span><span style="color: #0000ff;"&gt;this</span>.task =<span style="color: #000000;"&gt; task;
}

@Override
</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; run() {
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated method stub</span>

<span style="color: #000000;"> work();
}
<span style="color: #0000ff;">public <span style="color: #0000ff;">void<span style="color: #000000;"> work() {
System.out.println(name+"正在"+<span style="color: #000000;">task);
}
}

三个窗口都可以卖100张票。

<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> ThreadDemo4 {

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; main(String[] args) {
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated method stub</span>
    WinTicket winTicket1=<span style="color: #0000ff;"&gt;new</span> WinTicket("窗口1"<span style="color: #000000;"&gt;);
    WinTicket winTicket2</span>=<span style="color: #0000ff;"&gt;new</span> WinTicket("窗口2"<span style="color: #000000;"&gt;);
    WinTicket winTicket3</span>=<span style="color: #0000ff;"&gt;new</span> WinTicket("窗口3"<span style="color: #000000;"&gt;);
    winTicket1.start();
    winTicket2.start();
    winTicket3.start();

}

}
<span style="color: #0000ff;">class WinTicket <span style="color: #0000ff;">extends<span style="color: #000000;"> Thread{
<span style="color: #0000ff;">private <span style="color: #0000ff;">int ticket=100<span style="color: #000000;">;

</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; WinTicket() {
    </span><span style="color: #0000ff;"&gt;super</span><span style="color: #000000;"&gt;();
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated constructor stub</span>

<span style="color: #000000;"> }
<span style="color: #0000ff;">public<span style="color: #000000;"> WinTicket(String name) {
<span style="color: #0000ff;">super<span style="color: #000000;">(name);
}
@Override
<span style="color: #0000ff;">public <span style="color: #0000ff;">void<span style="color: #000000;"> run() {
<span style="color: #008000;">//<span style="color: #008000;"> TODO Auto-generated method stub
<span style="color: #0000ff;">while(<span style="color: #0000ff;">true<span style="color: #000000;">) {
<span style="color: #0000ff;">if(ticket>0<span style="color: #000000;">) {
String name=<span style="color: #000000;">Thread.currentThread().getName();
System.out.println(name+"卖出"+ticket--<span style="color: #000000;">);
}<span style="color: #0000ff;">else<span style="color: #000000;"> {
<span style="color: #0000ff;">break<span style="color: #000000;">;
}
}
}

}

?4.多个线程共享资源

<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> ThreadDemo5 {

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; main(String[] args) {
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated method stub
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;创建共享资源对象</span>
    TicketRes ticketRes=<span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; TicketRes();
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;创建线程对象</span>
    Thread w1=<span style="color: #0000ff;"&gt;new</span> Thread(ticketRes,"窗口1"<span style="color: #000000;"&gt;);
    Thread w2</span>=<span style="color: #0000ff;"&gt;new</span> Thread(ticketRes,"窗口2"<span style="color: #000000;"&gt;);
    Thread w3</span>=<span style="color: #0000ff;"&gt;new</span> Thread(ticketRes,"窗口3"<span style="color: #000000;"&gt;);
    w1.start();
    w2.start();
    w3.start();
}

}
<span style="color: #008000;">//<span style="color: #008000;">共享资源类
<span style="color: #0000ff;">class TicketRes <span style="color: #0000ff;">implements<span style="color: #000000;"> Runnable{
<span style="color: #0000ff;">private <span style="color: #0000ff;">int ticket=100<span style="color: #000000;">;

@Override
</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; run() {
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated method stub</span>
    <span style="color: #0000ff;"&gt;while</span>(<span style="color: #0000ff;"&gt;true</span><span style="color: #000000;"&gt;) {
        </span><span style="color: #0000ff;"&gt;if</span>(ticket>=1<span style="color: #000000;"&gt;) {
            System.out.println(Thread.currentThread().getName()</span>+"卖第"+ticket+"张票"<span style="color: #000000;"&gt;);
            ticket</span>--<span style="color: #000000;"&gt;;
        }</span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt; {
            </span><span style="color: #0000ff;"&gt;break</span><span style="color: #000000;"&gt;;
        }
    }
}

}
<span style="color: #008000;">//<span style="color: #008000;">出现一个问题:第一百张票会同时在三个窗口卖出。这个涉及到同步和异步的问题?该怎么解决呢?<a href="https://www.cnblogs.com/loober/p/10235234.html" target="_blank">Java多线程基础(二)揭晓答案

5.线程调度

优先级

调度方法

<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> JoinDemo {

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;void</span> main(String[] args) <span style="color: #0000ff;"&gt;throws</span><span style="color: #000000;"&gt; InterruptedException {
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated method stub</span>
    System.out.println("主线程在执行..."<span style="color: #000000;"&gt;);
    JoinThread joinThread1</span>=<span style="color: #0000ff;"&gt;new</span> JoinThread("线程1"<span style="color: #000000;"&gt;);
    JoinThread joinThread2</span>=<span style="color: #0000ff;"&gt;new</span> JoinThread("线程2"<span style="color: #000000;"&gt;);
    JoinThread joinThread3</span>=<span style="color: #0000ff;"&gt;new</span> JoinThread("线程3"<span style="color: #000000;"&gt;);
    System.out.println(</span>"启动子线程..."<span style="color: #000000;"&gt;);
    joinThread1.start();
    joinThread2.start();
    joinThread3.start();
    joinThread1.join();
    joinThread2.join();
    joinThread3.join();
    </span><span style="color: #0000ff;"&gt;for</span>(<span style="color: #0000ff;"&gt;int</span> i=0;i<10;i++<span style="color: #000000;"&gt;) {
        System.out.println(</span>"主线程正在执行..."<span style="color: #000000;"&gt;);
    }
    System.out.println(</span>"结束"<span style="color: #000000;"&gt;);
}

}
<span style="color: #0000ff;">class JoinThread <span style="color: #0000ff;">extends<span style="color: #000000;"> Thread{

</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; JoinThread() {
    </span><span style="color: #0000ff;"&gt;super</span><span style="color: #000000;"&gt;();
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated constructor stub</span>

<span style="color: #000000;"> }

</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; JoinThread(String name) {
    </span><span style="color: #0000ff;"&gt;super</span><span style="color: #000000;"&gt;(name);
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated constructor stub</span>

<span style="color: #000000;"> }

@Override
</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; run() {
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated method stub</span>
    <span style="color: #0000ff;"&gt;for</span>(<span style="color: #0000ff;"&gt;int</span> i=0;i<10;i++<span style="color: #000000;"&gt;) {
        System.out.println(Thread.currentThread().getName()</span>+"→"+<span style="color: #000000;"&gt;i);
    }
}

}

<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> SleepDemo {

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; main(String[] args){
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated method stub</span>
    SleepThread sleepThread=<span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; SleepThread();
    sleepThread.start();
}

}
<span style="color: #0000ff;">class SleepThread <span style="color: #0000ff;">extends<span style="color: #000000;"> Thread{

</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; SleepThread() {
    </span><span style="color: #0000ff;"&gt;super</span><span style="color: #000000;"&gt;();
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated constructor stub</span>

<span style="color: #000000;"> }

</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; SleepThread(String name) {
    </span><span style="color: #0000ff;"&gt;super</span><span style="color: #000000;"&gt;(name);
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated constructor stub</span>

<span style="color: #000000;"> }

@Override
</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; run() {
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated method stub</span>
    <span style="color: #0000ff;"&gt;for</span>(<span style="color: #0000ff;"&gt;int</span> i=10;i>=0;i--<span style="color: #000000;"&gt;) {
        </span><span style="color: #0000ff;"&gt;try</span><span style="color: #000000;"&gt; {
            Thread.sleep(</span>1000<span style="color: #000000;"&gt;);
            System.out.println(i);
        } </span><span style="color: #0000ff;"&gt;catch</span><span style="color: #000000;"&gt; (InterruptedException e) {
            </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated catch block</span>

<span style="color: #000000;"> e.printStackTrace();
}
}
}

}

<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> YieldDemo {

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; main(String[] args) {
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated method stub</span>
    YieldThread yieldThread1=<span style="color: #0000ff;"&gt;new</span> YieldThread("线程1"<span style="color: #000000;"&gt;);
    YieldThread yieldThread2</span>=<span style="color: #0000ff;"&gt;new</span> YieldThread("线程2"<span style="color: #000000;"&gt;);
    yieldThread1.start();
    yieldThread2.start();
}

}
<span style="color: #0000ff;">class YieldThread <span style="color: #0000ff;">extends<span style="color: #000000;"> Thread{

</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; YieldThread() {
    </span><span style="color: #0000ff;"&gt;super</span><span style="color: #000000;"&gt;();
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated constructor stub</span>

<span style="color: #000000;"> }

</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; YieldThread(String name) {
    </span><span style="color: #0000ff;"&gt;super</span><span style="color: #000000;"&gt;(name);
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated constructor stub</span>

<span style="color: #000000;"> }

@Override
</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; run() {
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated method stub</span>
    <span style="color: #0000ff;"&gt;for</span>(<span style="color: #0000ff;"&gt;int</span> i=0;i<20;i++<span style="color: #000000;"&gt;) {
        System.out.println(Thread.currentThread().getName()</span>+"→"+<span style="color: #000000;"&gt;i);
        Thread.yield();</span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;避让,谦让,让出CPU,还有再去抢的资格</span>

<span style="color: #000000;"> }
}

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读