ফলন () এর প্রধান ব্যবহারগুলি কী কী এবং এটি কীভাবে যোগদান () এবং বাধা () থেকে পৃথক হয়?


106

yield()জাভাতে পদ্ধতি ব্যবহার সম্পর্কে আমি কিছুটা বিভ্রান্ত , বিশেষত নীচের উদাহরণ কোডটিতে। আমি আরও পড়েছি যে ফলনটি () 'থ্রেড কার্যকর হওয়া রোধ করতে ব্যবহৃত হয়'।

আমার প্রশ্নগুলি হ'ল:

  1. আমি বিশ্বাস করি যে নীচের কোডটি একই ব্যবহারের সময় yield()এবং কখন এটি ব্যবহার না করে ফলাফল করে output এটা কি সঠিক?

  2. আসলে, এর প্রধান ব্যবহারগুলি কী কী yield()?

  3. কোন পদ্ধতিতে এবং পদ্ধতিগুলি yield()থেকে আলাদা ?join()interrupt()

কোড উদাহরণ:

public class MyRunnable implements Runnable {

   public static void main(String[] args) {
      Thread t = new Thread(new MyRunnable());
      t.start();

      for(int i=0; i<5; i++) {
          System.out.println("Inside main");
      }
   }

   public void run() {
      for(int i=0; i<5; i++) {
          System.out.println("Inside run");
          Thread.yield();
      }
   }
}

উপরে এবং ব্যবহার ছাড়াই উভয় কোড ব্যবহার করে আমি একই আউটপুট পাই yield():

Inside main
Inside main
Inside main
Inside main
Inside main
Inside run
Inside run
Inside run
Inside run
Inside run

এই প্রশস্ততা খুব প্রশস্ত হওয়ার কারণে বন্ধ করা উচিত ।
রাইডওয়াল্ড

না, এটি যখন একই ফল দেয় yield()না এবং যখন না থাকে। যখন আপনার চেয়ে আমি বড় 5 না হয়, আপনি yield()পদ্ধতির প্রভাব দেখতে পারেন ।
লক্ষ্মণ

উত্তর:


97

সূত্র: http://www.javamex.com/tutorials/threads/yeld.shtml

উইন্ডোজ

হটস্পট বাস্তবায়নে, Thread.yield()জাভা 5 এবং জাভা 6 এর মধ্যে যেভাবে কাজ করা হয়েছে তার পরিবর্তন হয়েছে।

জাভা 5 এ, Thread.yield()উইন্ডোজ এপিআই কল কল করে Sleep(0)। এটির বর্তমান থ্রেডের কোয়ান্টামটি সাফ করার এবং এটির অগ্রাধিকার স্তরের জন্য সারির প্রান্তে রেখে দেওয়ার বিশেষ প্রভাব রয়েছে । অন্য কথায়, একই অগ্রাধিকারের সমস্ত চলমান থ্রেড (এবং বৃহত্তর অগ্রাধিকারের তারা) ফলিত থ্রেড পরবর্তী সিপিইউ সময় দেওয়ার আগে চালানোর সুযোগ পাবে। এটি শেষ পর্যন্ত পুনরায় নির্ধারিত হয়ে গেলে, এটি সম্পূর্ণ পূর্ণ কোয়ান্টামের সাথে ফিরে আসবে , তবে ফলনের সময় থেকে বাকি কোনও কোয়ান্টামকে "বহন" করে না। এই আচরণটি শূন্য নন এমন ঘুমের থেকে কিছুটা আলাদা যেখানে স্লিপিং থ্রেডটি সাধারণত 1 কোয়ান্টাম মান হ্রাস করে (কার্যত, 10 বা 15 মিমি টিকের 1/3)।

জাভা 6 এ, এই আচরণটি পরিবর্তন করা হয়েছিল। হটস্পট ভিএম এখন Thread.yield()উইন্ডোজ SwitchToThread()এপিআই কল ব্যবহার করে প্রয়োগ করে । এই কলটি বর্তমান থ্রেডটিকে তার বর্তমান টাইমলাইসটি ছেড়ে দেয় , তবে এটির পুরো কোয়ান্টামটি নয়। এর অর্থ অন্যান্য থ্রেডের অগ্রাধিকারের উপর নির্ভর করে ফলনশীল থ্রেডটি একটি বিঘ্নিত সময়ের পরে আবার নির্ধারিত হতে পারে । ( টাইমলাইকের উপর আরও তথ্যের জন্য থ্রেড শিডিংয়ের বিভাগটি দেখুন ))

লিনাক্স

লিনাক্সের অধীনে হটস্পট কেবল কল করে sched_yield()। এই কলটির পরিণতিগুলি কিছুটা আলাদা এবং সম্ভবত উইন্ডোজের অধীনে আরও গুরুতর:

  • ফলিত থ্রেড অন্য সমস্ত থ্রেডে সিপিইউয়ের স্লাইস না হওয়া পর্যন্ত সিপিইউয়ের আর একটি স্লাইস পাবেন না ;
  • (কমপক্ষে কার্নেল ২.6.৮ এর পরে), থ্রেডটি যে ফল পেয়েছে তা তার সাম্প্রতিক সিপিইউ বরাদ্দের বিষয়ে শিডিয়ুলার হিউরিস্টিকসকে স্পষ্টভাবে বিবেচনায় নিয়েছে - সুতরাং, সুস্পষ্টভাবে, ফলিত একটি থ্রেড নির্ধারিত সময়ে আরও সিপিইউ দেওয়া যেতে পারে ভবিষ্যৎ.

( অগ্রাধিকার এবং সময়সূচী অ্যালগরিদমের বিষয়ে আরও বিশদের জন্য থ্রেড শিডিংয়ের বিভাগটি দেখুন ))

কখন ব্যবহার করবেন yield()?

আমি ব্যবহারিকভাবে বলতে হবে না । এর আচরণটি স্ট্যান্ডার্ডভাবে সংজ্ঞায়িত হয় নি এবং ফলন () দিয়ে আপনি যে কাজগুলি সম্পাদন করতে চাইতে পারেন তা সম্পাদন করার জন্য আরও ভাল উপায় রয়েছে:

  • আপনি যদি সিপিইউর কেবলমাত্র একটি অংশ ব্যবহার করার চেষ্টা করছেন , আপনি থ্রেডটি শেষ প্রক্রিয়াকরণে কতটা সিপিইউ ব্যবহার করেছেন তা অনুমান করে আরও নিয়ন্ত্রণযোগ্য উপায়ে এটি করতে পারেন, তারপরে ক্ষতিপূরণ দেওয়ার জন্য কিছুটা সময় ঘুমিয়ে দেখুন: দেখুন ঘুম () পদ্ধতি;
  • যদি আপনি কোনও প্রক্রিয়া বা সংস্থানটি সম্পূর্ণ হওয়ার জন্য বা উপলব্ধ হয়ে ওঠার অপেক্ষায় থাকেন তবে এটি সম্পাদন করার আরও কার্যকর উপায় রয়েছে যেমন: যোগ করে () যোগ করার মাধ্যমে অন্য থ্রেডটি সম্পূর্ণ হওয়ার অপেক্ষার জন্য অপেক্ষা / নোটিফিকেশন ব্যবহার করে একটি থ্রেডকে অনুমতি দেয় অন্যটিকে সিগন্যাল করার জন্য যে কোনও কাজ সম্পূর্ণ হয়েছে বা আদর্শভাবে জাভা 5 এর মধ্যে একটি সেমফোর বা ব্লকিং সারি যেমন জাভা 5 কনস্ট্রাকশন ব্যবহার করে ।

18
"অবশিষ্ট কোয়ান্টাম", "পুরো কোয়ান্টাম" - কোথাও কোথাও কেউ "কোয়ান্টাম" শব্দের অর্থ কী ভুলে গিয়েছিল
kbolino

@ কেবোলিনো কোয়ান্টাম নতুন পরমাণু।
এভেজেনি সার্জিভ

2
@ কেবোলিনো - ... লাতিন: "যত বেশি", "কত" । উপরের ব্যবহারের সাথে এটি কোনওভাবে কীভাবে বিরোধী তা আমি দেখতে পাচ্ছি না। শব্দের অর্থ হ'ল কিছু বর্ণিত পরিমাণ, সুতরাং এটি ব্যবহৃত এবং বাকী অংশগুলিতে বিভক্ত করা আমার কাছে পুরোপুরি যুক্তিযুক্ত বলে মনে হয়।
পেরিটা ব্রেটা

@ পেরিটাব্রেটা আমার ধারণা অনুমান যে আপনি যদি পদার্থবিদ্যার বাইরের শব্দটির সাথে পরিচিত হন তবে এটি আরও বোধগম্য হবে। পদার্থবিজ্ঞানের সংজ্ঞাটি আমি কেবল জানতাম।
kbolino

এই উত্তরটি 7, 8, 9-র জন্য আপডেট করার জন্য আমি এই প্রশ্নের উপরে একটি অনুগ্রহ রেখেছি 7,8 এবং 8 এর বর্তমান তথ্যের সাথে এটি সম্পাদনা করুন এবং আপনি অনুগ্রহ পাবেন।

40

আমি দেখতে পাচ্ছি যে প্রশ্নটি অনুগ্রহের সাথে পুনরায় সক্রিয় করা হয়েছে, এখন ব্যবহারিক ব্যবহারগুলি কী তা জিজ্ঞাসা yieldকরছে। আমি আমার অভিজ্ঞতা থেকে একটি উদাহরণ দেব।

যেমনটি আমরা জানি, yieldকলিং থ্রেডকে প্রসেসরটি যে চলছে তা ছেড়ে দিতে বাধ্য করে যাতে অন্য থ্রেডটি চালানোর সময় নির্ধারণ করা যায়। বর্তমান থ্রেডটি আপাতত তার কাজ শেষ করার পরে এটি দরকারী তবে দ্রুত সারিটির সামনের দিকে ফিরে এসে কিছু অবস্থার পরিবর্তন হয়েছে কিনা তা পরীক্ষা করতে চায়। এটি কন্ডিশন ভেরিয়েবল থেকে কীভাবে আলাদা? yieldথ্রেডটিকে চলমান অবস্থায় দ্রুত ফিরে আসতে সক্ষম করে। যখন কোনও শর্তের পরিবর্তনশীলটির জন্য অপেক্ষা করা হয় তখন থ্রেড স্থগিত করা হয় এবং এটি চালিয়ে যাওয়া উচিত যে সিগন্যাল করার জন্য আলাদা থ্রেডের জন্য অপেক্ষা করা প্রয়োজন।yieldমূলত বলেছে "আলাদা থ্রেড চালানোর অনুমতি দিন, তবে আমার রাজ্যে খুব দ্রুত কিছু পরিবর্তন হওয়ার প্রত্যাশা করায় খুব তাড়াতাড়ি আমাকে আবার কাজ করতে ফিরে আসতে দিন"। ব্যস্ত কাটাকাটির দিকে এই ইঙ্গিত দেয়, যেখানে একটি শর্ত দ্রুত পরিবর্তন করতে পারে তবে থ্রেড স্থগিতকরণে একটি বড় পারফরম্যান্স হিট লাগবে।

তবে পর্যাপ্ত বাধা, এখানে একটি দৃ concrete় উদাহরণ: ওয়েভফ্রন্ট সমান্তরাল প্যাটার্ন। এই সমস্যার একটি প্রাথমিক উদাহরণ হ'ল 0 এবং 1 এর সাথে ভরা দ্বিদলীয় অ্যারেতে 1 এর স্বতন্ত্র "দ্বীপপুঞ্জ" গণনা করা। একটি "দ্বীপ" হ'ল কোষগুলির একটি গ্রুপ যা প্রত্যেকে উল্লম্ব বা অনুভূমিকভাবে সংযুক্ত থাকে:

1 0 0 0
1 1 0 0
0 0 0 1
0 0 1 1
0 0 1 1

এখানে আমাদের 1s এর দুটি দ্বীপ রয়েছে: উপরের-বাম এবং নীচে-ডান।

একটি সহজ সমাধানটি হ'ল পুরো অ্যারেতে প্রথম পাস করা এবং 1 টি মানকে একটি বাড়ানো কাউন্টারের সাথে প্রতিস্থাপন করা যা শেষ পর্যন্ত প্রতিটি 1 সারি মেজাজের ক্রম সংখ্যার সাথে প্রতিস্থাপন করা হয়েছিল:

1 0 0 0
2 3 0 0
0 0 0 4
0 0 5 6
0 0 7 8

পরবর্তী পদক্ষেপে, প্রতিটি মান নিজের এবং প্রতিবেশীদের মানগুলির মধ্যে ন্যূনতম দ্বারা প্রতিস্থাপিত হয়:

1 0 0 0
1 1 0 0
0 0 0 4
0 0 4 4
0 0 4 4

আমরা এখন সহজেই নির্ধারণ করতে পারি যে আমাদের দুটি দ্বীপ রয়েছে।

আমরা যে অংশটি সমান্তরালভাবে চালাতে চাই তা হ'ল পদক্ষেপটি যেখানে আমরা সর্বনিম্নগুলি গণনা করি। খুব বেশি বিশদে না গিয়ে, প্রতিটি থ্রেড একটি আন্তঃবিবাহিতভাবে সারি পায় এবং উপরের সারিটি থ্রেড প্রক্রিয়াজাতকরণের দ্বারা গুণিত মানগুলিতে নির্ভর করে। সুতরাং, প্রতিটি থ্রেডটি পূর্ববর্তী লাইনে থ্রেড প্রক্রিয়াজাতকরণের তুলনায় কিছুটা পিছিয়ে থাকা দরকার, তবে যুক্তিসঙ্গত সময়ের মধ্যেও এটি রাখা উচিত। আরো বিস্তারিত এবং বাস্তবায়নের নিজে নিজেই উপস্থাপন করা হয় এই দস্তাবেজটি । এর ব্যবহার sleep(0)কম বেশি কম সি এর সমষ্টি বিবেচনা করুন yield

এই ক্ষেত্রে yieldঅর্ডার বিরাম ঘুরে প্রতিটি থ্রেড বলপূর্বক ক্ষেত্রে ব্যবহার করা হয়েছিল, কিন্তু থ্রেড সংলগ্ন সারি প্রক্রিয়াকরণের ইতিমধ্যে খুব দ্রুত এগিয়ে যাবে সাল থেকে একটি শর্ত পরিবর্তনশীল একটি সর্বনাশা পছন্দ প্রমাণ হবে।

আপনি দেখতে পাচ্ছেন, yieldএটি বেশ সূক্ষ্ম শস্যের অপ্টিমাইজেশন। এটি ভুল জায়গায় ব্যবহার করা যেমন কদাচিৎ পরিবর্তিত অবস্থার জন্য অপেক্ষা করা সিপিইউর অত্যধিক ব্যবহারের কারণ হবে।

দীর্ঘ বাচ্চাদের জন্য দুঃখিত, আশা করি আমি নিজেকে পরিষ্কার করে দিয়েছি।


1
আইআইইউসি আপনি নথিতে যা উপস্থাপন করেন, ধারণাটি এই ক্ষেত্রে, ব্যস্ত-অপেক্ষা করা আরও দক্ষ, yieldযখন শর্তটি সন্তুষ্ট না হয় তখন উচ্চতর- স্তরের সিঙ্ক্রোনাইজেশন আদিম, তাই না?
পেটর পুডলক

3
@ পেটার পুডলক: হ্যাঁ। আমি থ্রেড সিগন্যালিং ব্যবহার করে এই বনামটিকে বেঞ্চমার্ক করেছি এবং এক্ষেত্রে পারফরম্যান্সের পার্থক্য বিশাল। যেহেতু শর্তটি খুব দ্রুত সত্য হয়ে উঠতে পারে (এটি মূল সমস্যা) তাই কন্ডিশন ভেরিয়েবলগুলি খুব ধীর হয় কারণ থ্রেডটি ওএস দ্বারা চেপে ধরে রাখার পরিবর্তে খুব কম সময়ের জন্য সিপিইউ ছেড়ে দেওয়া হয় না yield
টিউডর

@ টিউডারের দুর্দান্ত ব্যাখ্যা!
বিকাশকারী মারিয়াস ইলানাস

1
"ঘুমের ব্যবহার (0) টি খেয়াল করুন যা ফলনের সমান পরিমাণে কম-বেশি হয়।" .. ভাল, আপনি যদি জাভা সহ ঘুম (0) চান তবে কেন আপনি কেবল এটি ব্যবহার করবেন না? থ্রেড.স্লিপ () এমন একটি জিনিস যা ইতিমধ্যে বিদ্যমান। আমি নিশ্চিত নই যে এই উত্তরটি কেন কেউ থ্রেড.সিল্ড (0) এর পরিবর্তে থ্রেড.ইয়েল্ড () ব্যবহার করবে সে সম্পর্কে যুক্তি সরবরাহ করে কিনা; তারা পৃথক কেন তা ব্যাখ্যা করে একটি বিদ্যমান থ্রেড রয়েছে।
eis

@ আইস: থ্রেড.স্লিপ (0) বনাম থ্রেড.ইয়েল্ড () এই উত্তরের ক্ষেত্রের বাইরে। আমি কেবল থ্রেড.স্লিপ (0) এর উল্লেখ করছিলাম লোকেরা সি এর নিকটতম সমতুল্য সন্ধান করছে প্রশ্নটি থ্রেড.ইিল্ড () এর ব্যবহার সম্পর্কে ছিল।
টিউডর

12

ভিন্নতা নিয়ে yield(), interrupt()এবং join()- সাধারণভাবে, শুধু জাভা না:

  1. ফলন : আক্ষরিক অর্থে 'ফলন' মানে হ'ল ছেড়ে দেওয়া, হাল ছেড়ে দেওয়া, আত্মসমর্পণ করা। একটি ফলনশীল থ্রেড অপারেটিং সিস্টেমকে (বা ভার্চুয়াল মেশিন, বা কী না) এটি বলে যে এটি অন্য থ্রেডগুলিকে তার স্থানে নির্ধারিত হতে দিতে রাজি। এটি ইঙ্গিত দেয় যে এটি খুব সমালোচনামূলক কিছু করছে না। এটি কেবল একটি ইঙ্গিত, যদিও এবং কোনও প্রভাব রাখার গ্যারান্টিযুক্ত নয়।
  2. যোগদান : যখন কোনও হ্যান্ডেল, বা টোকেন বা সত্তায় একাধিক থ্রেড 'যোগদান' করে, তখন অন্যান্য সমস্ত প্রাসঙ্গিক থ্রেড সম্পাদন সম্পন্ন না হওয়া পর্যন্ত সম্পূর্ণরূপে অপেক্ষা করে (সম্পূর্ণ বা তাদের নিজস্ব সংশ্লিষ্ট পর্যন্ত)। এর অর্থ একগুচ্ছ থ্রেড তাদের সমস্ত কাজ শেষ করেছে। তারপরে এই থ্রেডগুলির প্রত্যেকেরই অন্য কাজ চালিয়ে যাওয়ার সময় নির্ধারণ করা যেতে পারে, অনুমান করতে সক্ষম হয়ে সে সমস্ত কাজ সত্যই সম্পন্ন হয়েছে। (এসকিউএল যোগদানের সাথে বিভ্রান্ত হওয়ার দরকার নেই!)
  3. বাধা : একটি থ্রেড দ্বারা ব্যবহৃত অন্য থ্রেড যা ঘুমাচ্ছে, বা অপেক্ষা করছে, বা যোগদান করবে - যাতে আবার চলতে থাকবে তা নির্ধারিত হয়েছে, সম্ভবত কোনও ইঙ্গিত দিয়ে এটি ব্যহত হয়েছে। (হার্ডওয়্যার বিঘ্নগুলির সাথে বিভ্রান্ত হওয়ার দরকার নেই!)

জাভা জন্য, দেখুন

  1. যোগদান:

    থ্রেড.জাইন কিভাবে ব্যবহার করবেন? (এখানে স্ট্যাকওভারফ্লোতে)

    কবে থ্রেডে যোগ দেবেন?

  2. ফলনশীল:

  3. বিঘ্নিত:

    থ্রেড.আইনটারপ্রেট () কি মন্দ? (এখানে স্ট্যাকওভারফ্লোতে)


কোনও হ্যান্ডেল বা টোকেনে যোগ দিয়ে কী বোঝাতে চাইছেন? অপেক্ষার () এবং বিজ্ঞপ্তি () পদ্ধতিগুলি অবজেক্টে রয়েছে, কোনও ব্যবহারকারীকে যেকোন স্বেচ্ছাচারিত অবজেক্টের জন্য অপেক্ষা করতে দেয়। তবে যোগ দিন () কম বিমূর্ত বলে মনে হচ্ছে এবং চালিয়ে যাওয়ার আগে আপনি যে নির্দিষ্ট থ্রেডটি শেষ করতে চান তা কল করা দরকার ... তাই না?
spaaarky21

@ স্পাআরকি 21: আমি সাধারণত বোঝাতে চাইছি, জাভাতে অগত্যা নয়। এছাড়াও, একটি wait()যোগদান নয়, এটি কলিং থ্রেডটি অর্জন করার চেষ্টা করছে এমন একটি লক সম্পর্কে - এটি লকটি অন্যদের দ্বারা মুক্ত না করা এবং থ্রেড দ্বারা অর্জিত না হওয়া পর্যন্ত অপেক্ষা করে। সেই অনুসারে আমার উত্তরটি ট্যুইক করলেন।
einpoklum

10

প্রথমত, আসল বর্ণনাটি হ'ল

বর্তমানে সম্পাদনকারী থ্রেড অবজেক্টকে অস্থায়ীভাবে বিরতি দেয় এবং অন্যান্য থ্রেডগুলি কার্যকর করতে দেয়।

এখন, খুব সম্ভবত আপনার runনতুন থ্রেডটি নতুন থ্রেডের পদ্ধতিটি কার্যকর হওয়ার আগে পাঁচবার লুপটি কার্যকর করবে, সুতরাং yieldমূল থ্রেডের লুপটি কার্যকর হওয়ার পরে সমস্ত কল করা হবে।

joinথ্রেডটি চালানো না হওয়া পর্যন্ত বর্তমান থ্রেডটি থামিয়ে দেবে join()

interruptথ্রেড এটা আহ্বান করা হচ্ছে, যার ফলে বাধাপ্রাপ্ত হবে InterruptedException

yield অন্যান্য থ্রেডে একটি প্রসঙ্গে স্যুইচ করার অনুমতি দেয়, সুতরাং এই থ্রেডটি প্রক্রিয়াটির সম্পূর্ণ সিপিইউ ব্যবহার গ্রহণ করবে না।


+1 টি। এছাড়াও নোট করুন যে ফলন কল করার পরে (), সমান অগ্রাধিকারের থ্রেডের একটি পুল প্রদান করে, একই থ্রেড আবার কার্যকর করার জন্য নির্বাচিত হবে না এমন কোনও গ্যারান্টি নেই।
অ্যান্ড্রু ফিল্ডেন

যাইহোক, SwitchToThread()কল ঘুমের চেয়ে ভাল (0) এবং এটি জাভাতে একটি বাগ হওয়া উচিত :)
Петров Петров

4

বর্তমান উত্তর (গুলি) পুরানো এবং সাম্প্রতিক পরিবর্তনগুলি প্রদত্ত সংশোধন প্রয়োজন।

6 থেকে 9 সাল পর্যন্ত জাভা সংস্করণগুলির মধ্যে কোনও ব্যবহারিক পার্থক্য নেই Thread.yield()

টি এল; ডিআর;

ওপেনজেডকে উত্স কোডের ভিত্তিতে উপসংহার ( http://hg.openjdk.java.net/ )।

যদি তা না হয় একাউন্টে হটস্পট USDT প্রোব (সিস্টেম ট্রেসিং তথ্য বর্ণনা করা হয়েছে সমর্থনে নেওয়া dtrace নির্দেশিকা ) এবং জেভিএম সম্পত্তি ConvertYieldToSleepসোর্স কোড তাহলে yield()প্রায় একই। নীচে ব্যাখ্যা দেখুন।

জাভা 9 :

Thread.yield()ওএস-নির্দিষ্ট পদ্ধতিটি কল করে os::naked_yield():
লিনাক্সে:

void os::naked_yield() {
    sched_yield();
}

উইন্ডোজে:

void os::naked_yield() {
    SwitchToThread();
}

জাভা 8 এবং আগের:

Thread.yield()ওএস-নির্দিষ্ট পদ্ধতিটি কল করে os::yield():
লিনাক্সে:

void os::yield() {
    sched_yield();
}

উইন্ডোজে:

void os::yield() {  os::NakedYield(); }

যেমন আপনি দেখতে পাচ্ছেন, Thread.yeald()লিনাক্সে সমস্ত জাভা সংস্করণের জন্য অভিন্ন।
উইন্ডোজ এর os::NakedYield()জেডিকে 8 থেকে দেখুন :

os::YieldResult os::NakedYield() {
    // Use either SwitchToThread() or Sleep(0)
    // Consider passing back the return value from SwitchToThread().
    if (os::Kernel32Dll::SwitchToThreadAvailable()) {
        return SwitchToThread() ? os::YIELD_SWITCHED : os::YIELD_NONEREADY ;
    } else {
        Sleep(0);
    }
    return os::YIELD_UNKNOWN ;
}

উইন 32 এপিআই এর SwitchToThread()পদ্ধতির অস্তিত্বের অতিরিক্ত পরীক্ষায় জাভা 9 এবং জাভা 8 এর মধ্যে পার্থক্য । একই কোড জাভা 6. জন্য উপস্থিত থাকলে
সোর্স কোড os::NakedYield()মধ্যে JDK 7 কিছুটা ভিন্ন কিন্তু এটি একই আচরণ আছে:

    os::YieldResult os::NakedYield() {
    // Use either SwitchToThread() or Sleep(0)
    // Consider passing back the return value from SwitchToThread().
    // We use GetProcAddress() as ancient Win9X versions of windows doen't support SwitchToThread.
    // In that case we revert to Sleep(0).
    static volatile STTSignature stt = (STTSignature) 1 ;

    if (stt == ((STTSignature) 1)) {
        stt = (STTSignature) ::GetProcAddress (LoadLibrary ("Kernel32.dll"), "SwitchToThread") ;
        // It's OK if threads race during initialization as the operation above is idempotent.
    }
    if (stt != NULL) {
        return (*stt)() ? os::YIELD_SWITCHED : os::YIELD_NONEREADY ;
    } else {
        Sleep (0) ;
    }
    return os::YIELD_UNKNOWN ;
}

SwitchToThread()উইন্ডোজ এক্সপি এবং উইন্ডোজ সার্ভার 2003 ( এমএসডিএন নোট দেখুন ) থেকে পদ্ধতির কারণে অতিরিক্ত চেকটি বাদ দেওয়া হয়েছে ।


2

আসলে, উৎপাদনের প্রধান ব্যবহারগুলি () কী কী?

ফলন সিপিইউকে পরামর্শ দেয় যে আপনি বর্তমান থ্রেডটি বন্ধ করতে পারেন এবং উচ্চতর অগ্রাধিকার দিয়ে থ্রেডগুলি কার্যকর করতে শুরু করতে পারেন। অন্য কথায়, আরও সমালোচনামূলক থ্রেডের জন্য ঘর ছেড়ে যাওয়ার জন্য বর্তমান থ্রেডকে নিম্ন অগ্রাধিকারের মান নির্ধারণ করুন।

আমি বিশ্বাস করি যে নীচের কোডটি ফলন () ব্যবহার করার সময় এবং এটি ব্যবহার না করে উভয়ই একই ফলাফলের ফলাফল করে। এটা কি সঠিক?

না, দু'জনেই আলাদা ফলাফল আনবে। ফলন () ছাড়াই, একবার থ্রেডটি নিয়ন্ত্রণ হয়ে গেলে এটি একবারে 'ইনসাইড রান' লুপটি কার্যকর করবে। তবে, একটি ফলন () দিয়ে, থ্রেডটি নিয়ন্ত্রণ পেয়ে গেলে এটি একবার 'ইনসাইড রান' প্রিন্ট করবে এবং তারপরে অন্য থ্রেডের কাছে নিয়ন্ত্রণ হস্তান্তর করবে। মুলতুবিতে কোনও থ্রেড না থাকলে এই থ্রেডটি আবার শুরু করা হবে। সুতরাং প্রতিবার "ইনসাইড রান" কার্যকর করা হলে এটি অন্যান্য থ্রেডগুলি কার্যকর করার জন্য সন্ধান করবে এবং যদি কোনও থ্রেড পাওয়া না যায় তবে বর্তমান থ্রেড চালানো চালিয়ে যাবে।

কোন উপায়ে ফলন () যোগ () এবং বাধা () পদ্ধতি থেকে আলাদা?

ফলন () হ'ল অন্য গুরুত্বপূর্ণ থ্রেডগুলিতে ঘর দেওয়ার জন্য, যোগ দিন () অন্য থ্রেডের সম্পাদন সম্পন্ন করার অপেক্ষার জন্য অপেক্ষা করা, এবং বাধা দেওয়া () বর্তমানে অন্যরকম কিছু করার জন্য সঞ্চালিত থ্রেডকে বাধা দেওয়ার জন্য।


এই বিবৃতিটি সত্যটি ধরেছে কিনা তা নিশ্চিত করতে চেয়েছিলেন Without a yield(), once the thread gets control it will execute the 'Inside run' loop in one go? পরিষ্কার করে বলো.
আব্দুল্লাহ খান

0

Thread.yield()থ্রেডকে "চলমান" অবস্থা থেকে "চলমান" অবস্থায় যেতে দেয়। দ্রষ্টব্য: এটি থ্রেডকে "অপেক্ষা" অবস্থায় যেতে দেয় না।


@ পিজেমিচ, উদাহরণের মতো কোনও RUNNINGরাষ্ট্র নেই java.lang.Thread। তবে এটি নেটিভ থ্রেডের জন্য কোনও স্থানীয় "চলমান" রাষ্ট্রকে আবদ্ধ করে না যার জন্য Threadউদাহরণ প্রক্সি।
সোলায়মান স্লো

-1

Thread.yield ()

যখন আমরা থ্রেড.ইয়েল্ড () পদ্ধতিটি প্রার্থনা করি, তখন থ্রেড শিডিয়ুলার বর্তমানে চলমান থ্রেডটি রান্নেবল স্টেটে রাখে এবং সমান অগ্রাধিকার বা উচ্চতর অগ্রাধিকারের অন্য থ্রেড বেছে নেয়। যদি কোনও সমান এবং উচ্চতর অগ্রাধিকারের থ্রেড না থাকে তবে এটি কলিং ফলন () থ্রেডকে পুনরায় নির্ধারণ করে। মনে রাখবেন ফলন পদ্ধতিটি অপেক্ষা বা অবরুদ্ধ অবস্থায় যেতে থ্রেড তৈরি করে না। এটি কেবল রানিং স্টেট থেকে রান্নেবল স্টেটে কোনও থ্রেড তৈরি করতে পারে।

যোগদানের ()

যখন যোগদানের কোনও থ্রেড উদাহরণ দ্বারা আহ্বান করা হয়, এই থ্রেডটি বর্তমানে যোগ হওয়া থ্রেডটি সম্পূর্ণ না হওয়া পর্যন্ত অপেক্ষা করতে থ্রেডকে চালিত করতে বলবে। বর্তমান কাজটি শেষ হওয়ার আগে কোনও কাজ শেষ করা উচিত এমন সময়ে পরিস্থিতিতে যোগদান করা হয়।


-4

ফলন () এর প্রধান ব্যবহার হ'ল একাধিক-থ্রেডিং অ্যাপ্লিকেশন রাখার জন্য।

এই সমস্ত পদ্ধতির পার্থক্যগুলি হ'ল ফলন () অন্য থ্রেড কার্যকর করার সময় এবং থ্রেডটি শেষ হওয়ার পরে ফিরে আসার পরে থ্রেড ধরে রাখে, যোগ দিন () থ্রেডের শুরুটি একসাথে কার্যকর করা হবে এবং অন্য থ্রেডের পরে চালানো হবে সমাপ্ত, বাধা () কিছুক্ষণের জন্য একটি থ্রেডের কার্যকারিতা বন্ধ করবে।


আপনার উত্তর করার জন্য আপনাকে ধন্যবাদ। তবে এটি কেবল উত্তর দেয় যা ইতিমধ্যে অন্যান্য উত্তরগুলি বিস্তারিতভাবে বর্ণনা করে। আমি যথাযথ ব্যবহারের ক্ষেত্রে অনুদান প্রদান করছি - যেখানে yieldব্যবহার করা উচিত।
পেটর পুদলক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.